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

How do I require something in root project directory from inside node package library?

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

如果我有这样的目录结构

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

如果 run.sh 调用,它将 运行 index.js。在 index.js 内,我如何解析到根目录,稍后我可以在 index.js 内要求 config.js?

如果您在 index.js 中并且 config.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. 通过加载配置对象本身并将其传递给模块构造函数。

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

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

如果通过 NPM 脚本打包二进制 运行s:

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

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

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

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

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

然后我调用 const config = require('../config'),它起作用了。