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