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


当前回答

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

您可以安装特定的版本:

$ bower install jquery#1.11.1

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

$ bower install jquery#~1.11

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

$ bower install "jquery#<2.0 >1.10"

其他回答

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

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

基于semver,您可以使用

连字符范围X.Y.Z - A.B.C 1.2.3-2.3.4 表示>=1.2.3 <=2.3.4 x范围 1.2.x 1.X 1.2 . * 波浪字符范围 ~ 1.2.3 ~ 1.2 表示允许补丁级更改或较小的版本更改。 插入符号的范围为^1.2.3 ^0.2.5 ^0.0.4 允许不修改[major, minor, patch]元组中最左边的非零数字 ^ 1.2。X (mean >=1.2.0 <2.0.0) ^ 0.0。X(均值>=0.0.0 <0.1.0) ^0.0(表示>=0.0.0 <0.1.0)

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

您可以安装特定的版本:

$ bower install jquery#1.11.1

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

$ bower install jquery#~1.11

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

$ bower install "jquery#<2.0 >1.10"

如果没有补丁号,~相当于将.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 semver计算器来验证。

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

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

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

一旦确定了公共API,就可以通过对版本号的特定增量来传达对它的更改。考虑X.Y.Z (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"

但是,你可以使用波浪号/~语法来更具体:如果你只愿意接受从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。波浪范围是做不到的。

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

It's the expressive power of the tilde and the caret that explains why people use them much more than the simpler .x syntax: they simply let you do more. That's why you'll see the tilde used often even where .x would serve. As an example, see npm itself: its own package.json file includes lots of dependencies in ~2.4.0 format, rather than the 2.4.x format it could use. By sticking to ~, the syntax is consistent all the way down a list of 70+ versioned dependencies, regardless of which beginning patch number is acceptable.

无论如何,SemVer还有更多内容,但我不会在这里详细介绍。在节点semver包的自述文件中检查它。在练习和尝试理解SemVer的工作原理时,一定要使用语义版本计算器。


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

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