gpt4 book ai didi

npm - 如何从相对版本中获取确切的最新 npm 版本?

转载 作者:行者123 更新时间:2023-12-04 11:01:28 26 4
gpt4 key购买 nike

我希望能够获得 npm 的最新发布版本匹配相对语义版本。

例如,我想运行类似的东西:

npm -v 6.12.x

然后返回匹配的确切最新版本:
=> 6.12.1

我已经探索了一些可用的文档和命令,或者认为 npm 可以做到这一点,但是我没有看到任何可以在不安装另一个全局依赖项的情况下工作的内容。

最佳答案

简答: npm 不提供内置功能来完全满足您的要求。

但是,npm 确实提供了 npm-view命令。它的文档说明如下:

If a version range is provided, then data will be printed for every matching version of the package. This will show which version of jsdom was required by each matching version of yui3:

npm view yui3@'>0.5.4' dependencies.jsdom.



下面给出的两个解决方案演示了 npm view 的输出如何命令可以被解析/操作以满足您的要求(无需安装另一个全局依赖项)。

解决方案 A:*仅限 Nix 平台(Linux/MacOS...)

因此,可以借助一些额外的 Bash 实用程序来解析输出来满足您的要求。

考虑运行以下复合命令:
npm view npm@'6.12.x' version | tail -n 1 | cut -d "'" -f2

解释

下面对上述复合命令中的组成部分进行说明:
  • npm view npm@'6.12.x' version

    这部分使用了 npm view命令返回给定范围内的所有版本,即 6.12.x .

    独立运行这些部分会将以下内容打印到您的控制台:

    npm@6.12.0 '6.12.0'
    npm@6.12.1 '6.12.1'
  • | tail -n 1

    然后将先前显示的结果通过管道传送到 tail 使用 -n 1选项,以便只打印最后一行。

    运行:
    npm view npm@'6.12.x' version | tail -n 1

    打印:

    npm@6.12.1 '6.12.1'

  • | cut -d "'" -f2

    然后将先前显示的结果通过管道传送到 cut 使用 -d选项并指定单引号作为分隔符。 -f2 part 然后选择第二个项目。

    运行完整的复合命令:
    npm view npm@'6.12.x' version | tail -n 1 | cut -d "'" -f2

    打印您想要的结果:

    6.12.1


  • Semver 波浪号 ( ~ ) 和插入符号 ( ^ ) 范围。

    您还可以使用上述复合命令指定波浪号或插入符范围。

    示例:
  • 指定波浪号范围:
    npm view npm@'~4.0.0' version | tail -n 1 | cut -d "'" -f2
    ^^^^^^

    打印:

    4.0.5

  • 指定插入符号范围:
    npm view npm@'^4.0.0' version | tail -n 1 | cut -d "'" -f2
    ^^^^^^

    打印:

    4.6.1


  • 简化用法:

    如果您打算经常在 *nix 上运行该命令,那么我建议:
  • 运行以下复合命令:
    echo $'\n'"npmv() { npm view \"npm@\${1}\" version | tail -n 1 | cut -d \"'\" -f2; }" >> ~/.bash_profile

    这将添加一个 shell function到您的内容 .bash_profile文件,即它将添加一个新行,内容如下:

    npmv() { npm view "npm@${1}" version | tail -n 1 | cut -d "'" -f2; }

  • 然后,当您创建新 session (即创建新窗口或重新启动终端)时,将来您只需运行:
    npmv 6.12.x

    它很简洁,更类似于您问题中给出的示例命令。

  • 注:如果您已经有名为 npmv 的 npm 包在您的系统上全局安装,然后为 shell 函数/命令选择不同的名称以避免任何冲突。

    解决方案 B:跨平台(Windows/Linux/macOS...)

    如果您使用的是 Windows,或者想要一个跨平台的解决方案(即在 Windows、Linux 和 macOS 上成功运行的解决方案...),您将需要利用 nodejs 来实现您的要求。

    考虑运行以下复合命令:
    node -e "var res = require('child_process').execSync('npm view npm@"\"6.12.x\"" version', {encoding: 'utf-8'}).split('\n').filter(Boolean); if (res.length) { if (res.length === 1) { res = res[0]; } else { res = res.pop().split(' ')[1]; } console.log(res.replace(/[']/g, '')); }"

    是的,我同意它与解决方案 A 相比有些冗长 :)
    解释

    下面对上述复合命令中的组成部分进行说明:
  • node -e "..."

    我们调用 node和 nodejs 命令行选项 -e 用于评估给定的内联 JavaScript。
  • var res = require('child_process').execSync('npm view npm@"\"6.12.x\"" version', {encoding: 'utf-8'})

    给定 node.js 脚本 (JavaScript) 的这一部分输出相同的 npm view按照解决方案 A 的命令,即 npm view npm@"\"6.12.x\"" version , 使用 execSync() .
  • .split('\n').filter(Boolean);
    npm view的结果命令使用字符串的 split() 从字符串转换为数组方法 - 基本上结果的每一行都被换行符分割 \n这样每一行输出都成为数组中的一个元素。
    .filter(Boolean)部分从数组中删除由 npm view 附加的尾随空行产生的空元素。命令打印。
  • if (res.length) { if (res.length === 1) { res = res[0]; } else { res = res.pop().split(' ')[1]; } ... }

    这里我们使用了一些条件 if..else 语句以确保我们从数组中获得所需的项目。
  • console.log(res.replace(/[']/g, ''));

    最后,我们将结果记录到控制台并使用 replace() 删除包含 semver 值的单引号 ( ' ) 的方法。

  • Semver 波浪号 (~) 和插入符号 (^) 范围。

    根据解决方案 A,您还可以使用上述复合命令指定波浪号或插入符范围。

    示例:
  • 指定波浪号范围:
    node -e "var res = require('child_process').execSync('npm view npm@"\"~4.0.0\"" version', {encoding: 'utf-8'}).split('\n').filter(Boolean); if (res.length) { if (res.length === 1) { res = res[0]; } else { res = res.pop().split(' ')[1]; } console.log(res.replace(/[']/g, '')); }"
    ^^^^^^

    打印:

    4.0.5

  • 指定插入符号范围:
    node -e "var res = require('child_process').execSync('npm view npm@"\"^4.0.0\"" version', {encoding: 'utf-8'}).split('\n').filter(Boolean); if (res.length) { if (res.length === 1) { res = res[0]; } else { res = res.pop().split(' ')[1]; } console.log(res.replace(/[']/g, '')); }"
    ^^^^^^

    打印:

    4.6.1

  • 关于npm - 如何从相对版本中获取确切的最新 npm 版本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58773187/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com