什么是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。