如何从相对版本中获取确切的最新npm版本? 说明 Semver波浪号(6.12.1)和插入号(~)范围。简化用法:说明 Semver波浪号(〜)和插入号(^)范围。

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

例如,我想运行以下内容:

npm -v 6.12.x

然后返回与之匹配的确切最新版本:

=> 6.12.1

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

ccjjccnn 回答:如何从相对版本中获取确切的最新npm版本? 说明 Semver波浪号(6.12.1)和插入号(~)范围。简化用法:说明 Semver波浪号(〜)和插入号(^)范围。

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

但是,npm确实提供了npm-view命令。该文档说明了以下内容:

  

如果提供了版本范围,则将为软件包的每个匹配版本打印数据。这将显示每个匹配版本的yui3需要哪个版本的jsdom:

     

npm view yui3@'>0.5.4' dependencies.jsdom

下面给出的两个解决方案说明了如何{/ {1}}命令的输出进行解析/操作以满足您的要求(而不必安装另一个全局依赖项)。


解决方案A:*仅适用于九个平台(Linux / MacOS ...)

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

考虑运行以下复合命令:

npm view

说明

以下内容对上述复合命令中的组成部分进行了说明:

  1. 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
  2. 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

  3. npm@6.12.1 '6.12.1'

    然后,使用| cut -d "'" -f2选项将先前显示的结果通过管道传递到cut,并指定单引号作为定界符。然后-d部分选择第二项。

    运行完整的复合命令:

    -f2

    打印您想要的结果:

      

    npm view npm@'6.12.x' version | tail -n 1 | cut -d "'" -f2

Semver波浪号(6.12.1)和插入号(~)范围。

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

示例:

  • 指定波浪线范围:

    ^

    打印:

      

    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 ^^^^^^

简化用法:

如果您打算经常在 * nix 上运行命令,那么我建议:

  1. 运行以下复合命令:

    4.6.1

    这会将shell function添加到echo $'\n'"npmv() { npm view \"npm@\${1}\" version | tail -n 1 | cut -d \"'\" -f2; }" >> ~/.bash_profile 文件的内容中,即它将添加新行,内容为:

      

    .bash_profile

  2. 然后,当您创建新会话(即创建新窗口或重新启动终端)时,将来您只需运行:

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

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

注意:如果您已经在系统上全局安装了名为npmv的npm软件包,请为shell函数/命令选择一个不同的名称,以避免发生任何冲突。 / sub>


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

如果您使用的是Windows,或者想要一个跨平台的解决方案(例如,可以在Windows,Linux和macOS上成功运行的解决方案...),则需要利用nodejs来满足您的要求。 / p>

考虑运行以下复合命令:

npmv 6.12.x

是的,我同意,与解决方案A 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,'')); }"

相比,它有些冗长

说明

以下内容对上述复合命令中的组成部分进行了说明:

  1. :)

    我们调用node -e "...",然后使用nodejs命令行选项-e来评估给定的内联JavaScript。

  2. node

    给定的node.js脚本(JavaScript)的这一部分使用{{3}封装了与 Solution A 相同的var res = require('child_process').execSync('npm view npm@"\"6.12.x\"" version',{encoding: 'utf-8'})命令,即npm view }}。

  3. npm view npm@"\"6.12.x\"" version

    使用字符串的execSync()方法将.split('\n').filter(Boolean);命令的结果从字符串转换为数组-基本上,结果的每一行都由换行符npm view分隔,因此输出的每一行都成为数组中的一个元素。

    \n部分从Array中删除由.filter(Boolean)命令打印的其他尾随空行产生的空元素。

  4. npm view

    在这里,我们利用一些条件split()语句来确保我们从数组中获得所需的项。

  5. if (res.length) { if (res.length === 1) { res = res[0]; } else { res = res.pop().split(' ')[1]; } ... }

    最后,我们将结果记录到控制台,并使用if..else方法删除包含semver值的单引号(console.log(res.replace(/[']/g,''));)。

Semver波浪号(〜)和插入号(^)范围。

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

示例:

  • 指定波浪线范围:

    '

    打印:

      

    node -e "var res = require('child_process').execSync('npm view npm@"\"~4.0.0\"" version','')); }" ^^^^^^

  • 指定插入符范围:

    4.0.5

    打印:

      

    node -e "var res = require('child_process').execSync('npm view npm@"\"^4.0.0\"" version','')); }" ^^^^^^

本文链接:https://www.f2er.com/3135324.html

大家都在问