bower(和 npm)版本语法是啥?
Posted
技术标签:
【中文标题】bower(和 npm)版本语法是啥?【英文标题】:What is the bower (and npm) version syntax?bower(和 npm)版本语法是什么? 【发布时间】:2013-10-02 12:51:15 【问题描述】: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
的版本等等...
【问题讨论】:
这可能与***.com/a/19040351/537738重复 【参考方案1】:简而言之,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 架构有关。 (相关的插入符号运算符 ^
也是如此。)您可以使用 ~
来缩小您愿意接受的版本范围:
例如:要表明您将对 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"
【讨论】:
所以~
特别表示补丁(第三个)编号可能大于指定的编号,例如~1.2.3
等价于 >=1.2.3 <1.3.0
。
也可以用于次要(第二个)数字,根据上面的内联编辑。
x-notation 一开始读起来很直观,但不太灵活。例如,'1.1.x' === '>=1.1.0' === '~1.1.0'
。 1.1.0 的情况很简单。但是 x 符号不能像 '>=1.1.4'
或 '~1.1.4'
那样细化。因此,您最终会在依赖项列表中的一个位置使用'1.1.x'
,而在另一个位置使用'~2.7.3'
。这很好,并且有效,但是开发人员需要解析多种语法才能读取单个列表。而且,如果您正在编写包以编程方式设置版本,则需要单一语法。而且,大多数人都希望防止破坏性更改。因此,~
解决了所有问题。
"angular": "~1.2"
将不匹配 1.3、1.4、1.4.9。 "angular": "~1"
和 "angular": "~1.0"
也不等效。使用semver.npmjs.com进行测试
不得不谷歌“grok”。根据我的经验,这不是我们在澳大利亚使用的词。【参考方案2】:
Bower 使用 semver syntax,但这里有一些简单的示例:
您可以安装特定版本:
$ bower install jquery#1.11.1
您可以使用 ~ 来指定“任何以此开头的版本”:
$ bower install jquery#~1.11
您可以同时指定多个版本要求:
$ bower install "jquery#<2.0 >1.10"
【讨论】:
我很好奇这个的实际用途。轮盘赌安装? 查看@XMLilley 的答案(和 semver 文档)'start's with' 似乎是错误的,因为 1.12、1.13 也可以,只要主要版本没有上升......跨度> 【参考方案3】:基于semver,可以使用
连字符范围 X.Y.Z - A.B.C
1.2.3-2.3.4
表示 >=1.2.3
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
^0.0.x
(表示 >=0.0.0
^0.0
(表示 >=0.0.0
【讨论】:
感谢您的废话,易于阅读的答案。我不需要回溯或做任何事情,只是,砰,答案就出来了。干得好;)【参考方案4】:您还可以使用latest
关键字来安装可用的最新版本:
"dependencies":
"fontawesome": "latest"
【讨论】:
semver 没有提到这一点。你在哪里确定它是有效的? :) 它确实说“"*" := >=0.0.0
(任何版本都满足)”,这很接近但有点模糊,因为它没有具体说最新,所以它可能是它找到的第一个?
老实说,这只是反复试验——我试过了,它奏效了!您可能是正确的,它不是 100% 有效,但它确实有效。【参考方案5】:
如果没有补丁号,~
相当于将.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 进行验证。
【讨论】:
以上是关于bower(和 npm)版本语法是啥?的主要内容,如果未能解决你的问题,请参考以下文章
bower程序包管理器与npm的对比及handlebars包的使用实例
在 Meteor 中安装和使用 bower 的正确方法是啥?