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

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的版本,等等…

115309 次浏览

简单地说,Bower版本号(和NPM)的语法被称为SemVer,这是“语义版本”的缩写。你可以在Node/npm中的semver解析器的API上找到在Bower和NPM中使用的SemVer的详细语法文档。你可以在semver.org中了解更多关于底层规范(其中提到了~或其他语法细节)。

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

SemVer不仅仅是一种语法!关于发布API的正确方法,它有一些非常有趣的内容,这将有助于理解语法的含义。至关重要的是:

一旦确定了公共API,就可以通过对版本号的特定增量来传达对它的更改。考虑X.Y.Z (Major.Minor.Patch)的版本格式。不影响API的错误修复会增加补丁版本,向后兼容的API添加/更改会增加小版本,向后不兼容的API更改会增加主版本。

所以,你关于~的具体问题与Major.Minor.Patch模式有关。(相关的插入符^也是如此。)你可以使用~来缩小你愿意接受的版本的范围:

  • 后续的缀块更改为相同的次要版本(“错误修复不影响API”),或者:
  • 后续的minor-level更改为相同的主版本(“向后兼容的API添加/更改”)

例如:表示您将接受1.2上的任何后续补丁级更改。X树,从1.2.0开始,但小于1.3.0,你可以使用:

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

这也会得到与使用.x语法相同的结果:

"angular": "1.2.x"

但是,你可以使用波浪号/~语法来更具体:如果你只愿意接受补丁级别的更改从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的任何小的或补丁级别的更改:

注意上面的最后一个变化:它被称为“脱字符号范围”。插入符号看起来非常像>,所以你可以原谅它表示“任何版本大于 1.0.0”。(在这一点上我肯定说错了。)不!

插入符号范围基本上是用来表示你关心只有最左边的有效数字——通常是主版本——并且你允许任何不影响最左边数字的次要或补丁级别的更改。然而,与波浪号范围指定主版本不同,插入符号范围允许您指定精确的次要/补丁起始点。因此,虽然^1.0.0 === ~1,一个插入符号范围,如^1.2.3,让你说你将采取任何改变>=1.2.3 && <2.0.0。波浪范围是做不到的。

当你近距离观察时,乍一看这一切似乎令人困惑。但是缩小一下,这样想:插入号只是让您表示您最关心的是最左边的有效数字。波浪号让你表示你最关心的是最右边的哪个数字剩下的是细节。

波浪号和插入符号的表达能力解释了为什么人们更多地使用它们而不是更简单的.x语法:它们只是让你做更多的事情。这就是为什么你会看到波浪号经常使用,甚至在.x可以使用的地方。作为一个例子,请参阅npm本身:它自己的包。json文件包含大量~2.4.0格式的依赖项,而不是可以使用的2.4.x格式。通过坚持~,语法在70多个版本依赖项的列表中始终是一致的,而不管哪个补丁号是可接受的。

无论如何,SemVer还有更多内容,但我不会在这里详细介绍。在节点semver包的自述文件上检查它。和请务必使用语义版本计算器当你在练习和试图让你的头脑明白SemVer是如何工作的。


回复:非连续版本号:OP的最后一个问题似乎是关于指定非连续的版本号/范围(如果我编辑得公平的话)。是的,你可以这样做,使用常见的双管道“或”操作符:||。像这样:

"angular": "1.2 <= 1.2.9 || >2.0.0"

Bower使用semver语法,但这里有几个简单的例子:

您可以安装特定的版本:

$ bower install jquery#1.11.1

你可以使用~来指定“任何以this开头的版本”:

$ bower install jquery#~1.11

你可以同时指定多个版本需求:

$ bower install "jquery#<2.0 >1.10"

基于semver,你可以使用

  • 连字符范围X.Y.Z - A.B.C 1.2.3-2.3.4 李表示> = 1.2.3 & lt; = 2.3.4 < / p > < / >

  • < p > < >强x范围 1.2.x 1.X 1.2 . * < /代码> < / p > < /李>
  • < p > <强>波浪字符范围 ~ 1.2.3 ~ 1.2

    .

    .

    .

    .
  • < p > 插入符号的范围为^1.2.3 ^0.2.5 ^0.0.4

    允许不修改[major, minor, patch]元组中最左边的非零数字

    • ^1.2.x(表示>=1.2.0 <2.0.0)
    • ^0.0.x(表示>=0.0.0 <0.1.0)
    • ^0.0(表示>=0.0.0 <0.1.0)
    • 李< / ul > < / >

你也可以使用latest关键字来安装可用的最新版本:

  "dependencies": {
"fontawesome": "latest"
}

如果没有补丁号,~相当于将.x附加到非波浪号版本。如果存在补丁号,~允许所有补丁号>=指定的补丁号。

~1     := 1.x
~1.2   := 1.2.x
~1.2.3 := (>=1.2.3 <1.3.0)

我没有足够的点来评论接受的答案,但一些波浪号信息与链接的semver文档不一致:"angular": "~1.2"匹配1.3,1.4,1.4.9。而且"angular": "~1""angular": "~1.0"是等价的。这可以用NPM永久计算器来验证。