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>",
,

但我无法找到&lt;version&gt; 使用的语法。我知道我可以指定版本为:

大于某个版本"&gt;1.0.0" 大于等于一个版本:"&gt;=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 架构有关。 (相关的插入符号运算符 ^ 也是如此。)您可以使用 ~ 来缩小您愿意接受的版本范围:

随后的补丁级别更改为相同的次要版本(“不影响 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'。插入符号看起来非常像&gt;,因此您可以原谅认为它表示“任何版本大于 1.0.0”。 (我肯定是误会了。)不!

插入符号范围基本上用于表示您关心最左边的有效数字 - 通常是主要版本 - 并且您将允许任何不重要的次要或补丁级别更改'不影响最左边的数字。然而,与指定主要版本的波浪号范围不同,插入符号范围允许您指定精确的次要/补丁起始点。因此,虽然^1.0.0 === ~1,但插入符号范围(如^1.2.3)让您说您将采取任何更改&gt;=1.2.3 &amp;&amp; &lt;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 等价于 &gt;=1.2.3 &lt;1.3.0 也可以用于次要(第二个)数字,根据上面的内联编辑。 x-notation 一开始读起来很直观,但不太灵活。例如,'1.1.x' === '&gt;=1.1.0' === '~1.1.0'。 1.1.0 的情况很简单。但是 x 符号不能像 '&gt;=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 没有提到这一点。你在哪里确定它是有效的? :) 它确实说“"*" := &gt;=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 的正确方法是啥?

ubuntu14.04下nodejs + npm + bower的安装调试和部署

Bower 未安装

npm基本语法

NodeJS+NPM+Bower+Android环境安装配置