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

时间:2013-09-26 13:50:38

标签: node.js bower semantic-versioning

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

5 个答案:

答案 0 :(得分:334)

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

你可以玩super-handy visual semver calculator,让所有这些都更容易理解和测试。

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”。 (我当然不知道了。)没有!

Caret范围基本上用于表示您只关心 左侧最重要的数字 - 通常是主要版本 - 并且您将允许任何次要或补丁级别的更改不会影响最左边的数字。然而,与指定主要版本的波浪号范围不同,插入符号范围允许您指定精确的次要/补丁起点。因此,在^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 package's readme上查看。并且确保在练习时使用semantic versioning calculator 并尝试了解SemVer的工作原理。


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

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

答案 1 :(得分:137)

基于semver,您可以使用

  • Hyphen Ranges X.Y.Z - A.B.C 1.2.3-2.3.4 表示&gt; = 1.2.3&lt; = 2.3.4

  • <强> X-范围 1.2.x 1.X 1.2.*

  • Tilde Ranges ~1.2.3 ~1.2 表示允许修补程序级别更改或次要版本更改。

  • Caret Ranges ^ 1.2.3 ^ 0.2.5 ^ 0.0.4

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

    • ^1.2.x(表示&gt; = 1.2.0&lt; 2.0.0)
    • ^0.0.x(表示&gt; = 0.0.0&lt; 0.1.0)
    • ^0.0(表示&gt; = 0.0.0&lt; 0.1.0)

答案 2 :(得分:75)

Bower使用semver syntax,但这里有一些简单的例子:

您可以安装特定版本:

$ bower install jquery#1.11.1

您可以使用〜指定以&#39;:

开头的任何版本
$ bower install jquery#~1.11

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

$ bower install "jquery#<2.0 >1.10"

答案 3 :(得分:13)

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

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

答案 4 :(得分:7)

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

~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 calculator进行验证。