【问题标题】:In Node.js, how can a module get data from an application's package.json?在 Node.js 中,模块如何从应用程序的 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 中正确命名的块可以覆盖它。基本上只是试图将配置数据保留在应用逻辑之外。

标签: json node.js npm


【解决方案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.js 和cd 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 是的,除非您的代码由外部启动器运行
      猜你喜欢
      • 2016-10-20
      • 2017-07-18
      • 2022-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-01
      • 1970-01-01
      相关资源
      最近更新 更多