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

时间:2013-10-04 05:54:00

标签: node.js npm node-modules

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

2 个答案:

答案 0 :(得分:3)

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

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

由于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. 使用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。它指的是包含脚本文件的目录。

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