我有一个模块。在其中,我想从我父应用程序的package.json文件中访问数据。这样做的最佳做法是什么?
我通过上升2级并需要文件(或使用nconf配置加载器)来做到这一点。
var appdir = path.resolve(__dirname, '../../');
nconf.file('app', path.join(appdir, 'package.json'));
但这似乎很容易破裂。
我也听说过pkginfo,它会自动从我自己的模块的package.json中获取信息,但我希望从父应用程序中获取数据。
感谢您的帮助!
编辑:我想另一种问题是,如何获取应用程序的路径(而不是模块路径)?答案 0 :(得分:4)
您可以使用
require.main.require './package'
但只有当您的父应用程序的文件位于其目录的根目录下时,它才会起作用。
您还可以将其打包到try ... catch
并将../
添加到路径,直至找到package.json
。
您可以在此处阅读有关访问主模块的更多信息http://nodejs.org/api/modules.html#modules_accessing_the_main_module
答案 1 :(得分:2)
添加到pcru的方法,这应该有效:
function loadMainPackageJSON(attempts) {
attempts = attempts || 1;
if (attempts > 5) {
throw new Error('Can\'t resolve main package.json file');
}
var mainPath = attempts === 1 ? './' : Array(attempts).join("../");
try {
return require.main.require(mainPath + 'package.json');
} catch (e) {
return loadMainPackageJSON(attempts + 1);
}
}
var packageJSON = loadMainPackageJSON();
请记住,这将为您提供主要模块,您认为这是您想要的,但如果您正在构建像我一样的命令行工具,那么您真正想要的是获取包。如果您的工具要在本地安装并使用npm run-script
答案 2 :(得分:1)
如Determine project root from a running node.js application中所述,进入应用程序路径的最简单方法之一是使用process.cwd()
,前提是您必须始终从同一目录启动主js程序。即node app/main.js
和cd app && node main.js
会产生不同的结果。
另一种方法是递归地跟随对module.parent
的引用,然后在module.filename
未定义时读出module.parent
。这也预先假定了一些关于您的应用程序的知识。如果主脚本相对于package.json的位置可能不同,它将无法工作。即你必须知道主脚本是在app目录的根目录中,还是在某种'bin','app'或'lib'目录中。但是,一旦找到顶级模块,就可以尝试使用pkginfo用于查找当前文件的package.json的相同算法找到最近的package.json。