9

我有一个模块。在其中,我想从我的父应用程序的 package.json 文件中访问数据。这样做的最佳实践方法是什么?

我通过提升 2 个级别并要求文件(或使用nconf配置加载器)以 janky 方式完成了此操作。

var appdir = path.resolve(__dirname, '../../');
nconf.file('app', path.join(appdir, 'package.json'));

但这似乎很容易破裂。

我也听说过pkginfo,它会自动从我自己的模块的 package.json 中获取信息,但我希望从父应用程序中获取数据。

谢谢你的帮助!

编辑:我想另一种询问方式是,我怎样才能获得应用程序的路径(而不是模块路径)?

4

3 回答 3

4

您可以使用

require.main.require './package'

但只有当您的父应用程序的文件位于其目录的根目录中时,它才会起作用。

您也可以将其包装try ... catch并添加../到路径中,直到找到package.json.

您可以在此处阅读有关访问主模块的更多信息http://nodejs.org/api/modules.html#modules_accessing_the_main_module

于 2013-06-15T08:13:24.787 回答
3

添加到 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();

请记住,这将为您提供主模块,您认为这是您想要的,但是如果您像我一样构建命令行工具,您真正想要的是获取 package.json 上面的两个文件夹如果您的工具打算在本地安装并使用npm run-script

于 2014-08-19T23:54:55.563 回答
1

从正在运行的 node.js 应用程序确定项目根目录中所述,进入应用程序路径的最简单方法之一是 using process.cwd(),前提是您始终从同一目录启动主 js 程序。即node app/main.js并且cd app && node main.js会给出不同的结果。

另一种方法可能是递归地遵循对 的引用,然后在未定义时module.parent读出。这也预设了一些关于您的应用程序的知识。如果主脚本相对于 package.json 的位置可能不同,它将不起作用。即,您必须知道主脚本是否位于应用程序目录的根目录中,或者可能位于某种“bin”、“app”或“lib”目录中。但是,一旦找到顶级模块,您可以尝试使用 pkginfo 用于查找当前文件的 package.json 的相同算法来定位最近的 package.json。module.filenamemodule.parent

于 2013-06-15T15:33:11.383 回答