279

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等...

4

5 回答 5

341

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

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

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 的次要或补丁级别更改:

请注意上面的最后一个变体:它被称为'caret range'。插入符号看起来非常像 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 还有更多内容,但我不会在这里详细说明。在node semver 包的自述文件中查看它。在练习并尝试了解 SemVer 的工作原理时,请务必使用语义版本控制计算器。


RE:非连续版本号:OP 的最后一个问题似乎是关于指定非连续版本号/范围(如果我已经公平地编辑了它)。是的,您可以这样做,使用常见的双管道“或”运算符:||。像这样:

"angular": "1.2 <= 1.2.9 || >2.0.0"
于 2013-12-05T22:46:40.593 回答
144

基于semver,您可以使用

  • 连字符范围 XYZ - ABC 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(意味着 >=1.2.0 <2.0.0)
    • ^0.0.x(意味着 >=0.0.0 <0.1.0)
    • ^0.0(意味着 >=0.0.0 <0.1.0)
于 2015-08-06T01:49:24.587 回答
76

Bower 使用semver 语法,但这里有一些简单的示例:

您可以安装特定版本:

$ bower install jquery#1.11.1

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

$ bower install jquery#~1.11

您可以同时指定多个版本要求:

$ bower install "jquery#<2.0 >1.10"
于 2014-06-09T13:42:16.997 回答
13

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

  "dependencies": {
    "fontawesome": "latest"
  }
于 2015-10-26T19:04:15.850 回答
7

如果没有补丁号,~则相当于追加.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 计算器进行验证。

于 2016-02-11T17:28:42.263 回答