【问题标题】:How should I load package.json for a CLI app installed globally?我应该如何为全局安装的 CLI 应用程序加载 package.json?
【发布时间】:2022-12-14 09:35:28
【问题描述】:

我创建了一个 cli 应用程序,它使用这段代码从 package.json 读取它的版本号

const packageJson = JSON.parse(fs.readFileSync(path.resolve('./package.json'), 'utf8'))

如果我在开发时使用 yarn start 或类似命令运行应用程序,这会很好用 但是在使用npm install --global app-name 安装包后,用户应该使用系统上任何路径的 declare 可执行文件。因此,如果我想运行它,请在/Users/myUser/Desktop 中说,我会收到这样的错误

Error: ENOENT: no such file or directory, open '/Users/myUser/Desktop/package.json'

那么在我的 CLI 中加载这个 package.json 的好的协议是什么,或者有更好的方法来处理这个问题吗?

【问题讨论】:

    标签: javascript npm command-line-interface npm-install package.json


    【解决方案1】:

    有没有更好的方法来解决这个问题?

    是的 - 您应该将版本号存储在实际包本身的某个地方。这样它将始终可用/可访问,并且没有 package.json 版本和已安装版本不同步的风险。例如,如果有人将你的包添加到一个项目中,然后运行yarn install,但后来使用git pull 来获取他们本地文件的最新版本,而这恰好包括你的包的版本升级,那么有一个窗口,其中 package.json 的版本号与安装的版本不同。

    【讨论】:

      【解决方案2】:

      使用 __dirname 因为它总是指包含该变量的文件的路径,而 ./ 为您提供工作目录,例如 process.cwd()

      const packageJson = JSON.parse(fs.readFileSync(
        path.join(__dirname, 'package.json'), 'utf8')
      )
      

      如果您使用的是 ES 模块,也可以获取 __dirname

      import { dirname } from 'path';
      import { fileURLToPath } from 'url';
      
      const __dirname = dirname(fileURLToPath(import.meta.url));
      
      const packageJson = JSON.parse(fs.readFileSync(
        path.join(__dirname, 'package.json'), 'utf8')
      )
      

      【讨论】:

      • 不幸的是,这不适用于 es 模块。
      • 我试过了,但其他文件夹也有同样的问题flaviocopes.com/fix-dirname-not-defined-es-module-scope
      • @iosifv 检查我的编辑
      • @iosifv “与其他文件夹有同样的问题”是什么意思?确保您的代码所在的脚本(上面的代码)位于package.json 的同一目录中
      猜你喜欢
      • 1970-01-01
      • 2016-09-30
      • 1970-01-01
      • 2011-08-24
      • 1970-01-01
      • 2017-01-05
      • 1970-01-01
      • 2022-11-12
      • 2015-07-24
      相关资源
      最近更新 更多