在运行时确定节点模块的位置
我正在构build一个基本上是node.js模块的工具。 这个工具可以全局安装(使用-g
选项)模块中有几个静态文件来生成报告。 如果模块是在本地调用的,我可以使用相对path./node_modules/<module>/static/filename
来引用静态文件。 但是当这个工具被作为一个命令调用时,我该如何引用这个静态文件? 我怎样才能确定工具是作为本地模块还是作为命令调用?
使用魔术variables__dirname。 它指的是包含脚本文件的目录。
当您的工具全局安装时,Unix系统通常有两个条目:
-
/usr/local/lib/node_modules/<module>/
– >包含所有模块源文件的目录 -
/usr/local/bin/<script.js>
– >符号链接到你的模块可执行文件
由于Node正在使用真正的path(即在所有符号链接被parsing之后)来parsing相对于当前模块的path,因此您不必担心全局安装和本地安装之间的差异。
你需要处理的是当前运行的节点进程可能不同的工作目录。 解决方法是根据模块所在的绝对pathparsing静态文件的相对path,而不是像在示例中那样假定节点进程将在特定目录中运行。
有两种方法:
-
使用
__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');
-
使用
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');