bower(和npm)版本的语法是什么?

jum4pzuy  于 2022-11-14  发布在  其他
关注(0)|答案(5)|浏览(142)

Bower使我能够使用以下语法指定软件包的版本要求:

"dependencies": {
  "<name>": "<version>",
},

但是我还没有找到<version>使用的语法。我知道我可以指定版本为:

  • 高于">1.0.0"的特定版本
  • 大于或等于某个版本:">=1.0.0"
  • 或者在某个范围内:"1.0.0 - 2.0.0" .

我还知道有一个包含波浪号的通用版本语法:"~1.0.0" .但我不确定它是什么意思,也不确定它是否与"=1.0.0"相同。
我还想知道我是否能够指定多个非连续的版本,例如1.0.3加上大于1.5.0的版本,等等。

tcbh2hod

tcbh2hod1#

简而言之,Bower版本号(和NPM)的语法被称为SemVer,是“语义版本控制”的缩写。你可以在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"

但是,您可以使用代字号/~语法来更具体地说明:如果您只愿意接受 * 从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的任何更改。使用代字号范围则不能这样做。
当你近距离观察时,一开始你会觉得很困惑,但是把镜头拉远一点,你可以这样想:***插入符号表示您最关心最左边的有效数字。波浪号表示您最关心最右边的有效数字。***其余的是详细信息。
正是波浪号和插入符号的表达能力解释了为什么人们使用它们比使用更简单的.x语法要多得多:他们只是让你做更多的事情。这就是为什么你会看到波浪号经常使用,甚至在.x的地方。作为一个例子,请看npm本身:它自己的package.json文件包含大量~2.4.0的依赖项,而不是它 * 可以 * 使用的2.4.x。通过坚持使用~,语法在70多个版本的依赖项列表中保持一致,而不管哪个开始的补丁号是可接受的。
无论如何,SemVer还有更多的内容,但我不会在这里详细介绍。请在node semver package's readme上查看。在练习和了解SemVer的工作原理时,请务必使用semantic versioning calculator
回复:非连续版本号:OP的最后一个问题似乎是关于指定非连续的版本号/范围(如果我已经正确地编辑了它)。是的,您可以使用常见的双管道“or”操作符来做到这一点:||。例如:

"angular": "1.2 <= 1.2.9 || >2.0.0"
vxbzzdmp

vxbzzdmp2#

基于semver,您可以使用

*连字符范围X.Y.Z - A.B.C1.2.3-2.3.4表示 〉=1.2.3〈=2.3.4
*X系列1.2.x 1.X 1.2.*
波浪号范围~1.2.3 ~1.2 * 表示允许修补程序级更改或次要版本更改。
*插入号范围^1.2.3 ^0.2.5 ^0.0.4

  • 允许不修改[major,minor,patch]元组中最左侧非零数字的更改 *
  • ^1.2.x(平均值〉=1.2.0〈2.0.0)
  • ^0.0.x(平均值〉=0.0.0〈0.1.0)
  • ^0.0(平均值〉=0.0.0〈0.1.0)
ht4b089n

ht4b089n3#

Bower使用semver syntax,但这里有几个快速示例:
您可以安装特定版本:

$ bower install jquery#1.11.1

您可以使用~来指定'以此开头的任何版本':

$ bower install jquery#~1.11

您可以同时指定多个版本需求:

$ bower install "jquery#<2.0 >1.10"
omhiaaxx

omhiaaxx4#

您也可以使用latest关键字来安装可用的最新版本:

"dependencies": {
    "fontawesome": "latest"
  }
nkcskrwz

nkcskrwz5#

如果没有补丁号,则~相当于在非波浪号版本后追加.x;如果有补丁号,则~允许所有补丁号〉=指定的补丁号。

~1     := 1.x
~1.2   := 1.2.x
~1.2.3 := (>=1.2.3 <1.3.0)

我没有足够的观点来评论这个公认的答案,但是一些波浪号信息与链接的semver文档不一致:"angular": "~1.2"与1.3、1.4、1.4.9匹配。此外,"angular": "~1""angular": "~1.0"等效。这可以使用npm semver calculator进行验证。

相关问题