简而言之,Bower版本号(以及NPM的)的语法称为SemVer,即“语义化版本控制”,其详细语法文档可在
Node/npm中的semver解析器API中找到。您可以在
semver.org上了解有关底层规范的更多信息(其中不包括~或其他语法细节)。您可以使用
超级方便的视觉semver计算器来轻松理解和测试所有这些内容。
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"
如果你使用的是向左迁移(towards the major version)的版本控制策略……
"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
. 您无法使用波浪线范围实现这一点。
一开始所有这些似乎很令人困惑,但请稍微看远一点,这样来考虑:插入符号只是让您说出您最关心的是最左侧的有效数字。波浪线则让您说出您最关心的是最右侧的数字。 其余都是细节。
正是脱字符和波浪线的表达能力解释了为什么人们比简单的.x
语法使用它们:它们让您可以做更多事情。这就是为什么你会经常看到波浪线即使在.x
可行的情况下也会被使用。例如,请参见npm本身:其自己的package.json文件包含许多以~2.4.0
格式的依赖项,而不是2.4.x
格式它可以使用。通过坚持使用~
,该语法在一个由70多个版本化的依赖项组成的列表中始终保持一致,而不管哪个起始修补程序编号是可接受的。
无论如何,SemVer还有更多内容,但我不会在这里详细介绍。在node semver package's readme上查看它。并且在练习和努力理解SemVer工作原理的同时,一定要使用语义化版本计算器。
关于非连续版本号:如果我正确编辑了OP的最后一个问题,那么他似乎是关于指定非连续版本号/范围的。是的,您可以使用常见的双管“或”运算符||
来实现这一点。像这样:
"angular": "1.2 <= 1.2.9 || >2.0.0"