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


274

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,等等。


Answers:


341

简而言之,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"

27
因此~,特别是意味着补丁(第三个)号可以大于指定的补丁号(例如~1.2.3>=1.2.3 <1.3.0
z0r

1
上面的每个编辑也可以用于次要(第二个)数字。
XML

有趣的是,SemVer文档似乎也允许使用x表示法(对人类而言,这更加直观)。
Frank Nocke

2
刚开始阅读时,x表示法很直观,但灵活性较差。例如,'1.1.x' === '>=1.1.0' === '~1.1.0'。1.1.0的情况很简单。但是x表示法不能像'>=1.1.4'或那样精细'~1.1.4'。因此,您最终会'1.1.x'在依赖项列表中的一个地方,然后'~2.7.3'在另一个地方。很好并且可以工作,但是开发人员然后需要解析多种语法以读取单个列表。而且,如果要编写程序集以编程方式设置版本,则需要一种语法。而且,大多数人都想防止重大变化。因此,使用解决了所有问题~
XML

1
哈哈 我认为“ grok”的地域性不如书呆子文化(可能与年龄有关)@Clonkex。对于将来的读者:这是对海因莱因的《陌生人陌生人》的引用...
XML

141

基于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)

21
感谢您的废话,易于阅读的答案。我没有回头之类的东西,只是,繁荣,有答案。做得好;)
toddmo

76

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

您可以安装特定版本:

$ bower install jquery#1.11.1

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

$ bower install jquery#~1.11

您可以一起指定多个版本要求:

$ bower install "jquery#<2.0 >1.10"

1
我对此的实际用途感到好奇。轮盘安装?
gravidThoughts 2015年

看@XMLilley的答案(和semver docs)“开始于”似乎是错误的,因为1.12、1.13也可以,只要主要版本不涨……
Frank Nocke

13

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

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

1
semver没有提到这一点。您在哪里确认有效?:)它确实说了“ "*" := >=0.0.0(任何版本都可以满足)”,但这很接近但有点含糊,因为它没有具体说出最新的消息,所以它可能是它找到的第一个?
GazB

老实说,这只是反复试验-我尝试了,并且奏效了!您可能是正确的,它不是100%有效,但确实可以。
shacker

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计算器进行验证。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.