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

Sam*_*pak 273 node.js semantic-versioning bower

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

"dependencies": {
  "<name>": "<version>",
},
Run Code Online (Sandbox Code Playgroud)

但我一直无法找到用于该语法的语法<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等的版本等...

XML*_*XML 338

简而言之,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"
Run Code Online (Sandbox Code Playgroud)

这也可以获得与使用.x语法相同的结果:

"angular": "1.2.x"
Run Code Online (Sandbox Code Playgroud)

但是,您可以使用波形符/ ~语法更具体:如果您只愿意接受从1.2.4开始但仍然小于1.3.0的补丁级别更改,您将使用:

"angular": "~1.2.4"
Run Code Online (Sandbox Code Playgroud)

向左移动,朝向主要版本,如果您使用...

"angular": "~1"
Run Code Online (Sandbox Code Playgroud)

......和......一样

"angular": "1.x"
  or:
"angular": "^1.0.0"
Run Code Online (Sandbox Code Playgroud)

...并匹配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还有更多,但我不打算在这里详细介绍.在节点semver软件包的自述文件中查看它.并且一定要在练习时使用语义版本控制计算器并尝试了解SemVer的工作原理.


RE:非连续版本号:OP的最后一个问题似乎是关于指定非连续版本号/范围(如果我公平地编辑它).是的,您可以使用常见的双管"或"运算符来执行此操作:||.像这样:

"angular": "1.2 <= 1.2.9 || >2.0.0"
Run Code Online (Sandbox Code Playgroud)

  • 所以`~`特别意味着补丁(第三)数可能大于指定数,例如`~1.2.3`相当于`> = 1.2.3 <1.3.0`. (27认同)
  • x-notation最初是直观易读的,但灵活性要低得多.例如,''1.1.x'==='> = 1.1.0'==='~1.1.0'`.1.1.0的情况很简单.但是x-notation不能是粒状的,因为`'> = 1.1.4'或`'~1.1.4'.那么,你在依赖列表中的一个地方结束了''1.1.x',在另一个地方结束了`'~2.7.3'.这很好,并且有效,但是开发人员需要解析多个语法来读取单个列表.而且,如果您正在编写程序设置版本的软件包,则需要单一语法.并且,大多数人都希望防止破坏性变化.因此,所有问题都用`~`解决了. (2认同)

Jer*_*ony 139

基于semver,您可以使用

  • 连字符范围XYZ - ABC 1.2.3-2.3.4 表示> = 1.2.3 <= 2.3.4

  • X-范围 1.2.x 1.X 1.2.*

  • Tilde Ranges ~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)

  • 谢谢你没有废话,易读的答案.我没有追踪或任何事情,只是,繁荣,这就是答案.做得好 ;) (20认同)

Wil*_*hes 76

Bower使用semver语法,但这里有几个简单的例子:

您可以安装特定版本:

$ bower install jquery#1.11.1
Run Code Online (Sandbox Code Playgroud)

您可以使用〜指定"以此为开头的任何版本":

$ bower install jquery#~1.11
Run Code Online (Sandbox Code Playgroud)

您可以一起指定多个版本要求:

$ bower install "jquery#<2.0 >1.10"
Run Code Online (Sandbox Code Playgroud)


sha*_*ker 13

您还可以使用该latest关键字安装最新版本:

  "dependencies": {
    "fontawesome": "latest"
  }
Run Code Online (Sandbox Code Playgroud)


小智 7

如果没有补丁号,~则相当于附加.x到非波浪号版本.如果有补丁号,则~允许所有补丁号> =指定的补丁号.

~1     := 1.x
~1.2   := 1.2.x
~1.2.3 := (>=1.2.3 <1.3.0)
Run Code Online (Sandbox Code Playgroud)

我没有足够的积分上公认的答案发表评论,但一些波浪信息是在与联semver文档赔率: "angular": "~1.2"符合1.3,1.4,1.4.9.也"angular": "~1""angular": "~1.0"等价的.这可以使用npm semver计算器进行验证.