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

Bower使我能够使用以下语法指定软件包的版本要求:

"dependencies": { "<name>": "<version>", }, 

但是我一直无法find<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版本号(和NPM)的语法被称为SemVer,这是“语义版本控制”的缩写。 您可以在Node / npm中的semver分析器的API中find有关 Bower和NPM中使用的SemVer的详细语法的文档。 您可以在semver.org上了解更多关于底层规范( 没有提及~或其他语法细节)的信息 。

有一个超级方便的视觉semver计算器,你可以玩,使这一切都更容易grok和testing。

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" 

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

当你仔细观察时,这一切似乎都让人困惑。 但是缩小一下,就这样想一想: 插入符号只是让你说你最关心的是最重要的数字。 代字号可以让你说你最关心哪一个数字是最右边的。 其余的细节。

这是代字号和插入符号的expression力,它解释了人们使用它们的原因远不止是简单的.x语法:它们只是让你做更多的事情。 这就是为什么你会看到经常使用代.x即使在.x服务的地方。 作为一个例子,请参考npm本身:它自己的package.json文件包含很多~2.4.0格式的依赖关系,而不是它可以使用的2.4.x格式。 通过坚持~ ,语法一直沿着70+版本依赖关系列表一致,无论哪个开始补丁号码是可接受的。

无论如何,还有更多的SemVer,但我不想在这里详细说明。 在节点semver包的自述文件中检查它。 在练习时, 一定要使用语义版本控制计算器 ,并试着让您了解SemVer的工作原理。


RE:非连续版本号:OP的最后一个问题似乎是指定非连续的版本号/范围(如果我已经公平地编辑了)。 是的,你可以这样做,使用普通的双pipe“或”操作符: || 。 像这样:

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

基于semver ,你可以使用

  • 连字符范围XYZ – ABC 1.2.3-2.3.4表示> = 1.2.3 <= 2.3.4

  • X-Ranges 1.2.x 1.X 1.2.*

  • Tilde范围〜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)

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

你可以安装一个特定的版本:

 $ bower install jquery#1.11.1 

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

 $ bower install jquery#~1.11 

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

 $ bower install "jquery#<2.0 >1.10" 

您也可以使用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.2 "angular": "~1.2"匹配1.3,1.4,1.4.9。 另外"angular": "~1""angular": "~1.0"相同的。 这可以用npm semver计算器来validation。