【问题标题】:What is the fastest way to programatically install or update to the latest version a global package?以编程方式安装或更新到最新版本的全局包的最快方法是什么?
【发布时间】:2024-01-23 19:47:01
【问题描述】:

我有一个npx 脚本,它将全局安装/更新某个包到最新版本(如果还没有的话)。

运行npm i -g myPackage 以确保最新版本耗时过长。看起来它会检查所有包依赖项并检查它们的版本,即使所需的包已经是最新版本。

我想做这样的事情,但以编程方式。我已经使用execa 包来处理类似的东西,并且可能会适合它。:

  • npm list -g myPackage 检查安装包

如果已安装,请检查是否更新

  • npm outdated -g myPackage

如果未安装或过期,

  • npm i -g myPackage 安装/更新它。

是否有任何现成的解决方案或通过 npm 内置的方法?否则,如何以编程方式检查上述两个验证的结果?

【问题讨论】:

    标签: node.js npm package version npm-install


    【解决方案1】:

    这是我在 TS 中的做法,它正在工作。不确定这是否是最好的方法,但如果它已经更新,则比npm i -g myPackage 花费的时间更少:

    import execa from 'execa';
    
    async function checkGlobalPackageUpdate(packageName: string): Promise<'notInstalled' | 'outdated' | 'updated'> {
      console.log(`Checking if ${packageName} is installed and updated...`);
    
      // Check if it's installed
      try {
        await execa('npm', ['list', '-g', packageName]);
      } catch {
        return 'notInstalled';
      }
    
      // Check if it's updated
      const result = await execa('npm', ['outdated', '-g', packageName]);
      const updated = result.stdout === '';
      return updated ? 'updated' : 'outdated';
    }
    

    如果没有更好的选择,我可能会创建一个简单的 npm/npx 包来使用它,并提供更多配置。

    【讨论】: