一尘不染

bower(和npm)版本语法是什么?

node.js

Bower使我可以使用以下语法来指定软件包的版本要求:

"dependencies": {
  "<name>": "<version>",
},

但是我无法找到用于的语法<version>。我知道我可以将版本指定为:

  • 大于某个版本 ">1.0.0"
  • 大于或等于版本: ">=1.0.0"
  • 或在一定范围内:"1.0.0 - 2.0.0"

我也知道有一个通用的语法包含波浪号:"~1.0.0"。但是我不确定这意味着什么以及它是否与相同"=1.0.0"

我也很想知道我是否能够指定多个非连续版本,例如完全1.0.3大于的加号1.5.0,等等。


阅读 345

收藏
2020-07-07

共1个答案

一尘不染

简而言之,Bower版本号(和NPM的)的语法称为SemVer,它是“语义版本控制”的缩写。您可以在Node /
npm内semver解析器
的API上找到Bower和NPM中使用的SemVer详细语法的文档。您可以在semver.org上了解有关基础规范的更多信息(
提及~或其他语法详细信息)。

您可以使用一个超级方便的可视化算法计算器,使所有这些更容易理解和测试。

SemVer不只是一种语法!关于发布API的正确方法,有很多有趣的事情要说,这将有助于理解语法的含义。至关重要的是:

识别公共API后,您将以版本号的特定增量传达对它的更改。 考虑XYZ(Major.Minor.Patch)的版本格式
。不影响API的错误修复程序会增加补丁程序版本,向后兼容的API添加/更改会向后增加次要版本,向后不兼容的API更改会导致主版本。

因此,您的特定问题~与该Major.Minor.Patch模式有关。(和相关的插入号运算符一样^。)您可以使用~将想要接受的版本范围缩小到以下任一:

  • 随后对相同次要版本的 补丁程序级别 更改( “不影响API的错误修复” ),或:
  • 随后对同一主版本的 次要 更改( “向后兼容的API添加/更改”

例如:为了表明您将在1.2.x树上进行任何后续的补丁程序级更改,从1.2.0开始,但小于1.3.0,可以使用:

"angular": "~1.2"
  or:
"angular": "~1.2.0"

这也为您提供与使用.x语法相同的结果:

"angular": "1.2.x"

但是,您可以使用tilde / ~语法来更加具体:如果您只愿意接受 从1.2.4开始 但仍小于1.3.0的补丁程序级更改,则可以使用:

"angular": "~1.2.4"

如果使用的话,向左移,移向 主要 版本。

"angular": "~1"

…与…相同

"angular": "1.x"
  or:
"angular": "^1.0.0"

…并匹配高于1.0.0且低于2.0的任何次要或补丁级别的更改:

请注意,上面的最后一个变体:称为 “插入符范围” 。插入符号看起来非常像a >,因此您会以为它的意思是“任何 大于
1.0.0的版本”。(我当然对此有所遗漏。)

插入符范围基本上是用来表示您
关心最左边的有效数字(通常是主版本),并且您将允许不影响该最左边的数字的任何次要或补丁级别的更改。但是,与指定主要版本的代字号范围不同,插入符范围可让您指定精确的次要/音色起点。因此,同时^1.0.0 === ~1,插入符号范围(例如)^1.2.3可以让您说您将进行任何更改>=1.2.3 && <2.0.0。您无法使用波浪号范围来做到这一点。

当您近距离观察时,所有这些乍一看似乎令人困惑。但是请稍等一会,然后以这种方式进行思考: 插入符号只是让您说出您最担心最左边的有效数字。
代字号可以让您说出您最担心哪个数字最右边。
剩下的就是细节。

代字号和插入号的表达能力解释了为什么人们使用它们而不是使用更简单的.x语法:它们只是让您执行更多操作。这就是为什么即使在.x需要使用的地方也会经常使用波浪号的原因。例如,请参阅npm本身:它自己的package.json文件包含许多~2.4.0格式依赖关系,而不是2.4.x
可以 使用的格式。坚持使用~,无论在哪个开头的补丁程序编号可接受的情况下,语法在70多个版本依赖关系的列表中始终保持一致。

无论如何,SemVer还有更多功能,但是我不会在这里详细说明。在节点semver软件包的自述文件中进行检查。并且在练习并尝试掌握SemVer的工作原理时,请 务必使用
语义版本控制计算器


RE:非连续的版本号:OP的最后一个问题似乎是关于指定非连续的版本号/范围(如果我进行了合理的编辑)。是的,您可以使用通用的双管道“或”运算符:||。像这样:

"angular": "1.2 <= 1.2.9 || >2.0.0"
2020-07-07