在 Node.js 中,模块如何从应用程序的 package.json 中获取数据?

Posted

技术标签:

【中文标题】在 Node.js 中,模块如何从应用程序的 package.json 中获取数据?【英文标题】:In Node.js, how can a module get data from an application's package.json? 【发布时间】:2013-04-24 11:33:10 【问题描述】:

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

我通过提升 2 个级别并需要文件(或使用 nconf 配置加载器)来完成此操作。

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

但这似乎很容易坏。

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

感谢您的帮助!

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

【问题讨论】:

听起来像是不应该发生的奇怪耦合,您到底想完成什么?您不能将应用程序中的包信息传递到模块中吗? 使用 nconf,我可以指定一个默认配置,然后用其他 JSON 文件覆盖它。所以我在模块文件夹中创建了一个默认的 config.json,然后(可选地)package.json 中正确命名的块可以覆盖它。基本上只是试图将配置数据保留在应用逻辑之外。 【参考方案1】:

你可以使用

require.main.require './package'

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

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

你可以在这里阅读更多关于访问主模块的信息http://nodejs.org/api/modules.html#modules_accessing_the_main_module

【讨论】:

【参考方案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();

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

【讨论】:

【参考方案3】:

如Determine project root from a running node.js application 中所述,进入应用程序路径的最简单方法之一是使用process.cwd(),前提是您始终从同一目录启动主 js 程序。即node app/main.jscd app && node main.js 会给出不同的结果。

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

【讨论】:

您可以使用require.main 来获取***模块,而不是通过父模块循环。 @TadeuszŁazurski 是的,除非您的代码由外部启动器运行

以上是关于在 Node.js 中,模块如何从应用程序的 package.json 中获取数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 node.js 模块导入 node.js 模块

如何从 Node.js 中执行外部程序?

如何从 Node.js IMAP 模块中的正文获取纯文本

如何在不使用 npm 的情况下安装 node.js 模块?

如何在 Node.js 中卸载 npm 模块?

从内存中的字符串加载 node.js 模块