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

新手上路,请多包涵

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 等…

原文由 Samuel Hapak 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 412
2 个回答

简而言之,Bower 版本号(和 NPM)的语法称为 SemVer,它是“语义版本控制”的缩写。您可以 在 Node/npm 中的 semver 解析器 的 API 上找到 Bower 和 NPM 中使用的 SemVer 详细语法的文档。您可以在 semver.org 上了解有关基础规范( 提及 --- ~ 或其他语法详细信息)的更多信息。

您可以使用一个 超级方便的视觉 semver 计算器,让所有这些更容易理解和测试。

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"

这也会为您提供与使用 .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 还有更多内容,但我不会在这里详述。在 节点 semver 包的自述文件 中查看。在练习和尝试了解 SemVer 的工作原理时 ,一定要使用 语义版本控制计算器


RE:非连续版本号:OP 的最后一个问题似乎是关于指定非连续版本号/范围(如果我已经公平地编辑了它)。是的,您可以使用常见的双管道“或”运算符来做到这一点: || 。像这样:

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

原文由 XML 发布,翻译遵循 CC BY-SA 3.0 许可协议

基于 semver ,你可以使用

  • 连字符范围 XYZ - ABC 1.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)

原文由 Jerome Anthony 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题