我想创建一个节点包模块,但是我很难要求根项目目录中的文件在我创建的节点包模块中使用。
如果我有这样的目录结构
- node_modules
- library_name
- lib
- index.js
- bin
- run.sh
- config.js
如果run.sh调用,它将运行index.js。在index.js里面,如何解析root目录,以后我可以在index.js中找到config.js?
答案 0 :(得分:2)
如果您位于index.js
且config.js
位于图表中node_modules
上方的目录中,那么您可以构建config.js
的路径,如下所示:
const path = require('path');
let configFilename = path.join(__dirname, "../../../", "config.js");
__dirname
是index.js
所在的目录。
第一个../
会将您带到library_name
目录。
第二个../
会将您带到node_modules
目录。
第三个../
会将您带到node_modules
(您称之为项目根目录)的父级,其中config.js
似乎是。
如果你真的希望你的模块独立于它的安装方式或NPM将来可能会如何改变,那么你需要以某种方式传递配置文件的位置:
process.cwd()
来访问配置文件。答案 1 :(得分:1)
我创建与您的模块相同的模块。
我致电const config = require('../config')
,它有效。
答案 2 :(得分:0)
包二进制可以显式接受配置路径作为参数。
如果包二进制文件不作为NPM脚本运行,则它不应该依赖于父项目结构。
如果包二进制文件通过NPM脚本运行:
"scripts": {
"foo": "library_name"
}
这会将当前工作目录设置为项目根目录,因此可能需要:
const config = require(path.join(process.cwd(), 'config'));
两种方法都可以结合起来;这通常用于向第三方CLI(Mocha等)提供具有默认位置的配置文件。