1

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

4

2 回答 2

3

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

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

因为 Node 使用真实路径(即在解析所有符号链接之后)来解析相对于当前模块的路径,所以您无需担心全局安装和本地安装之间的差异。

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

有两种方法:

  1. 使用__dirnameAPI 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');
    
  2. 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。它指的是包含您的脚本文件的目录。

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

于 2013-10-04T06:01:50.987 回答