简而言之,Bower 版本号(和 NPM)的语法称为 SemVer,它是“语义版本控制”的缩写。您可以在 Node/npm 中的 semver 解析器的 API 上找到在 Bower 和 NPM 中使用的 SemVer 详细语法的文档。您可以在semver.org了解有关底层规范(未提及~
或其他语法细节)的更多信息。
有一个超级方便的视觉 semver 计算器,您可以使用它,让所有这些更容易理解和测试。
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 的次要或补丁级别更改:
请注意上面的最后一个变体:它被称为'caret range'。插入符号看起来非常像 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 还有更多内容,但我不会在这里详细说明。在node semver 包的自述文件中查看它。在练习并尝试了解 SemVer 的工作原理时,请务必使用语义版本控制计算器。
RE:非连续版本号:OP 的最后一个问题似乎是关于指定非连续版本号/范围(如果我已经公平地编辑了它)。是的,您可以这样做,使用常见的双管道“或”运算符:||
。像这样:
"angular": "1.2 <= 1.2.9 || >2.0.0"