简单地说,Bower版本号(和NPM)的语法被称为SemVer,这是“语义版本”的缩写。你可以在Node/ NPM中的SemVer解析器API中找到在Bower和NPM中使用的SemVer的详细语法文档。您可以在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"
向左移动,朝向大调版本,如果你使用…
"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。波浪范围是做不到的。
当你近距离观察时,乍一看这一切似乎令人困惑。但是请稍微缩小一下,这样想:插入符号只是让您说您最关心的是最左边的有效数字。波浪号让你表示你最关心最右边的哪个数字。剩下的就是细节了。
It's the expressive power of the tilde and the caret that explains why people use them much more than the simpler .x syntax: they simply let you do more. That's why you'll see the tilde used often even where .x would serve. As an example, see npm itself: its own package.json file includes lots of dependencies in ~2.4.0 format, rather than the 2.4.x format it could use. By sticking to ~, the syntax is consistent all the way down a list of 70+ versioned dependencies, regardless of which beginning patch number is acceptable.
无论如何,SemVer还有更多内容,但我不会在这里详细介绍。在节点semver包的自述文件中检查它。在练习和尝试理解SemVer的工作原理时,一定要使用语义版本计算器。
回复:非连续版本号:OP的最后一个问题似乎是关于指定非连续的版本号/范围(如果我编辑得公平的话)。是的,您可以使用常见的双管道“或”操作符:||来做到这一点。像这样:
"angular": "1.2 <= 1.2.9 || >2.0.0"