我正在构建一个基本上是node.js模块的工具。此工具可以全局安装(使用-g
选项)我在模块中有很少的静态文件来生成报告。如果在本地调用模块,我可以引用具有相对路径./node_modules/<module>/static/filename
的静态文件。但是当该工具作为命令调用时,如何引用静态文件?如何确定该工具是作为本地模块还是作为命令调用的?
答案 0 :(得分:3)
当您的工具全局安装时,Unix系统上通常有两个条目:
/usr/local/lib/node_modules/<module>/
- &gt;包含所有模块源文件的目录/usr/local/bin/<script.js>
- &gt;符号链接到您的模块可执行脚本由于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');
使用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');
答案 1 :(得分:2)
使用魔术变量__dirname。它指的是包含脚本文件的目录。