在运行时确定节点模块的位置

我正在构build一个基本上是node.js模块的工具。 这个工具可以全局安装(使用-g选项)模块中有几个静态文件来生成报告。 如果模块是在本地调用的,我可以使用相对path./node_modules/<module>/static/filename来引用静态文件。 但是当这个工具被作为一个命令调用时,我该如何引用这个静态文件? 我怎样才能确定工具是作为本地模块还是作为命令调用?

使用魔术variables__dirname。 它指的是包含脚本文件的目录。

http://nodejs.org/api/globals.html#globals_dirname

当您的工具全局安装时,Unix系统通常有两个条目:

  • /usr/local/lib/node_modules/<module>/ – >包含所有模块源文件的目录
  • /usr/local/bin/<script.js> – >符号链接到你的模块可执行文件

由于Node正在使用真正的path(即在所有符号链接被parsing之后)来parsing相对于当前模块的path,因此您不必担心全局安装和本地安装之间的差异。

你需要处理的是当前运行的节点进程可能不同的工作目录。 解决方法是根据模块所在的绝对pathparsing静态文件的相对path,而不是像在示例中那样假定节点进程将在特定目录中运行。

有两种方法:

  1. 使用__dirname ( API文档 ),其中包含当前源文件的目录名称(path):

     var path = require('path'); // assuming this script is in package root directory var staticFile = path.resolve(__dirname, 'static', 'filename'); // if the script is in lib/ subdirectory, then you want to call var staticFile = path.resolve(__dirname, '..', 'static', 'filename'); 
  2. 使用require.resolve() ,它将返回与调用require()所使用的完全相同的文件名:

     // assuming this script is in package root directory var staticFile = require.resolve('./static/filename'); // if the script is in lib/ subdirectory, then you want to call var staticFile = require.resolve('../static/filename');