我正在构建一个基本上是 node.js 模块的工具。这个工具可以全局安装(带有-g
选项)我在模块中几乎没有静态文件来生成报告。如果模块在本地调用,我可以引用相对路径的静态文件./node_modules/<module>/static/filename
。但是当工具作为命令调用时,我如何引用静态文件?以及如何确定该工具是作为本地模块还是作为命令调用的?
问问题
1300 次
2 回答
3
当您的工具全局安装时,Unix 系统上通常有两个条目:
/usr/local/lib/node_modules/<module>/
-> 包含所有模块源文件的目录/usr/local/bin/<script.js>
-> 符号链接到您的模块可执行脚本
因为 Node 使用真实路径(即在解析所有符号链接之后)来解析相对于当前模块的路径,所以您无需担心全局安装和本地安装之间的差异。
您需要处理的是节点进程正在运行的可能不同的当前工作目录。解决方案是根据模块所在的绝对路径解析静态文件的相对路径,而不是假设节点进程将像您在示例中那样在特定目录中运行。
有两种方法:
使用
__dirname
(API docs),其中包含当前源文件的目录名(路径):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');
Using
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');
于 2013-10-04T14:30:04.353 回答
2
使用魔法变量 __dirname。它指的是包含您的脚本文件的目录。
于 2013-10-04T06:01:50.987 回答