简而言之,Bower 版本号(和 NPM)的语法称为 SemVer,它是“Semantic Versioning”的缩写。您可以在 the semver parser within Node/npm 的 API 上找到在 Bower 和 NPM 中使用的 SemVer 详细语法的文档。您可以在semver.org 了解有关底层规范的更多信息(没有提及~ 或其他语法细节)。
您可以使用super-handy visual semver calculator,让所有这些都更容易理解和测试。
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"
但是,您可以使用 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'。插入符号看起来非常像>,因此您可以原谅认为它表示“任何版本大于 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 上查看。并且一定要在练习时使用semantic versioning calculator,并尝试了解 SemVer 的工作原理。
RE:非连续版本号:OP 的最后一个问题似乎是关于指定非连续版本号/范围(如果我已经公平地编辑了它)。是的,您可以这样做,使用常见的双管道“或”运算符:||。像这样:
"angular": "1.2 <= 1.2.9 || >2.0.0"