如何从节点包库中的根项目目录中获取某些内容?

时间:2018-06-17 02:32:28

标签: javascript node.js node-modules

我想创建一个节点包模块,但是我很难要求根项目目录中的文件在我创建的节点包模块中使用。

如果我有这样的目录结构

- node_modules
  - library_name
    - lib
      - index.js
    - bin
      - run.sh
-  config.js

如果run.sh调用,它将运行index.js。在index.js里面,如何解析root目录,以后我可以在index.js中找到config.js?

3 个答案:

答案 0 :(得分:2)

如果您位于index.jsconfig.js位于图表中node_modules上方的目录中,那么您可以构建config.js的路径,如下所示:

const path = require('path');
let configFilename = path.join(__dirname, "../../../", "config.js");

__dirnameindex.js所在的目录。

第一个../会将您带到library_name目录。

第二个../会将您带到node_modules目录。

第三个../会将您带到node_modules(您称之为项目根目录)的父级,其中config.js似乎是。

如果你真的希望你的模块独立于它的安装方式或NPM将来可能会如何改变,那么你需要以某种方式传递配置文件的位置:

  1. 通过确保将当前工作目录设置为项目根目录,以便您可以使用process.cwd()来访问配置文件。
  2. 通过在启动项目时将环境变量设置为根目录。
  3. 将根目录传递给模块构造函数。
  4. 通过加载配置对象本身并将其传递给模块构造函数。

答案 1 :(得分:1)

我创建与您的模块相同的模块。

我致电const config = require('../config'),它有效。

答案 2 :(得分:0)

包二进制可以显式接受配置路径作为参数。

如果包二进制文件不作为NPM脚本运行,则它不应该依赖于父项目结构。

如果包二进制文件通过NPM脚本运行:

"scripts": {
  "foo": "library_name"
}

这会将当前工作目录设置为项目根目录,因此可能需要:

const config = require(path.join(process.cwd(), 'config'));

两种方法都可以结合起来;这通常用于向第三方CLI(Mocha等)提供具有默认位置的配置文件。