代码之家  ›  专栏  ›  技术社区  ›  Jefry Dewangga

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

  •  1
  • Jefry Dewangga  · 技术社区  · 7 年前

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

    如果我有这样的目录结构

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

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

    3 回复  |  直到 7 年前
        1
  •  2
  •   jfriend00    7 年前

    如果你在 index.js config.js 在上面的目录中 node_modules 在您的图表中,然后您可以构建到 组态JS 这样地:

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

    __dirname 是那个目录 索引文件 是在。

    第一 ../ 把你带到 library_name 目录。

    第二 把你带到 节点模块 目录。

    第三 带你去见 节点模块 (您称之为项目根目录)其中 组态JS 似乎是。


    如果您真的想让您的模块独立于它的安装方式或npm在未来可能发生的变化,那么您需要以各种方式传入配置文件的位置:

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

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

    我呼唤 const config = require('../config') 它起作用了。

        3
  •  0
  •   Estus Flask    7 年前

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

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

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

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

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

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

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