Flutter的pubspec.yaml文件中,依赖版本号前面的符号(^)是什么意思?

121
在我的Flutter项目的pubspec.yaml文件中,某些依赖项的版本号前面有一个插入符(^)。
dependencies:
  flutter:
    sdk: flutter
  cupertino_icons: ^0.1.2
  english_words: ^3.1.5

它的目的是什么?它意味着什么?

注释


你链接的YAML规范有点过时了,最新版本是1.2。在底部你会找到一个索引,如果 ^ 是YAML的特殊标记(实际上不是),你会在那里找到一个链接。不管怎样,对于许多人来说,YAML规范并不太容易理解;-) - Anthon
3个回答

173

在Dart中,插件的pub dependencies可以使用插入符号(^)来指定允许的版本范围。具体来说,从指定的版本到(但不包括)下一个非破坏性版本之间的任何版本都是可以的。

  • 因此,^3.1.5'>=3.1.5 <4.0.0'相同
  • ^1.2.3'>=1.2.3 <2.0.0'相同

这是长表达式的简写形式。

^表示,只要更新不会破坏我的应用程序,我就希望自动使用来自Pub的最新软件包。

注释

版本小于1.0.0的澄清

最初,我认为

  • ^0.1.2等同于'>=0.1.2 <0.2.0'(错误!)

然而,这是对语义化版本的错误理解。当主版本号为0(例如0.1.2中的0)时,意味着API不稳定,即使是次版本号的更改(例如0.1.2中的1)也可能表示有破坏性的更改。

语义化版本文章指出:

主版本号为零(0.y.z)用于初始开发。任何内容都可能随时更改。公共API不应被视为稳定的。

并且

我应该如何处理0.y.z初始开发阶段的修订版?

最简单的方法是从0.1.0开始你的初始开发版本,然后逐个增加每个后续版本的次版本号。

因此,以下是更正后的形式:

  • ^0.1.2等同于'>=0.1.2 <0.2.0'

感谢Günter Zöchbauer指出我的错误。

另请参阅


2
@jitsm555,最大版本是最小版本号之后的下一个主要数字。如果最小版本是3.1.5,那么主要版本号是3。在3之后的下一个数字是4,因此最大版本是4.0.0(即小于4.0.0但不包括4.0.0本身的任何版本)。 - Suragch
@Suragch,从2.0.0更新到2.1.0也被认为是破坏性变更吗? - iDecode
@iDecode,不,从2.0.02.1.0不是破坏性变更。 - Suragch
1
@Suragch 谢谢,这意味着对于版本号为 2.0.0 的包来说,2.1.02.0.1 都不是破坏性更改。 - iDecode
@Frankdroid7,正确。 - Suragch
显示剩余3条评论

23

插入符号^代表指定的版本及其以后的版本,这些版本相对于指定的版本不会引入破坏性变化。

Dart遵循语义化版本控制,并建议包维护者也使用此方法。

语义化版本控制定义了以下规则:

  • 对于 >= 1.0.0 版本,主版本需要在发生破坏性变化时递增。
  • 对于 < 1.0.0 版本,当发生破坏性变化时,次要版本需要递增。

例如:

^2.4.3 表示 >= 2.4.3 < 3.0.0

^0.17.19 表示 >= 0.17.19 <0.18.0


谢谢您的澄清。我误解了关于主版本0的部分。 - Suragch
考虑只添加一个注释,但担心它会变得太长。 - Günter Zöchbauer

3
这意味着任何不包含破坏性更改的依赖项的新版本都将被接受。
Dart语言遵循语义化版本控制,并将其用于软件包维护者。
通俗地说,^1.8.1表示 >= 1.8.1 < 2.0.0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接