Dart包版本如何工作,我该如何为我的Flutter插件进行版本控制?

14

我想知道在我的Flutter应用程序中如何解析Dart包版本。

比如说,我有一个依赖项foo并像这样声明一个依赖:

dependencies:
  foo: ^1.2.3

Dart Pub如何确定要解析哪个版本/当新版本可用时会发生什么?


此外,如果我想将我的Flutter插件发布到pub.dev,我该如何决定何时增加版本的哪个部分?

1个回答

19

Dart包版本控制

所有这些都归结于Dart包版本控制,即Flutter插件没有区别。

它基于SemVer 2.0.0-rc.1(语义化版本控制)。对于Dart包,约定的要点如下:

<1.0.0 >=1.0.0
0.major.minor+patch major.minor.patch
请注意,Pub还支持由以下版本表示的预发布版本:
<1.0.0 >=1.0.0
0.major.0-prerelease.patch major.0.0-prerelease.patch

示例版本可能是0.6.0-nullsafety.0(带有修补程序版本0.6.0-nullsafety.1)或2.0.0-dev.1

了解有关Dart软件包版本控制的更多信息

解决版本冲突

为了基本了解版本解决方案试图解决的问题,您可以阅读Dart软件包版本控制文章中的解决共享依赖项部分。我将在此处查看版本解析的caret语法方面。

Caret ^ 语法是在Dart中解决版本的标准语法,与上面的版本表密切相关。每当您使用foo: ^1.0.0定义依赖项时,就会涉及一些逻辑来确定可以从该字符串解析哪些版本。

通常,^ 匹配主要版本。这意味着,每当您在API中进行破坏性更改时,您都需要增加主要版本,因为那么依赖者将不会自动升级到您的下一个软件包版本。我将尝试再次在表格中说明匹配:

^0.4.2+1 ^1.3.0
>=0.4.2+1 <0.5.0 >=1.3.0 <2.0.0

正如您所看到的,caret语法将匹配任何大于或等于当前版本但小于下一个主要版本的版本。

请注意,在Dart中,预发布版本与正常版本处理方式不同(不完全按照SemVer规范)。您可以在GitHub上找到Pub's pub_semver工具的源代码。它声明预发布版本不会被caret语法(也不是传统语法)匹配:

^1.0.0 版本匹配?
1.4.2
1.5.0-beta
2.0.0-alpha
2.0.0

了解更多有关Dart软件包依赖的信息

pubspec.lock

我想快速提到在Dart中使用Pubspec锁定文件来解决依赖关系的作用。
我认为有一种直接的方法可以定义如何获取包的版本:
- 没有现有的pubspec.lock(初始获取),pub get将获取最新的可能版本(根据上述规则并满足所有共享依赖项的直接和传递约束条件)。 - 具有现有的pubspec.lock文件的pub get将优先选择锁定文件中的锁定版本,而不是最新版本(如果它们仍然满足由于自上次获取以来可能引入的依赖关系的约束条件)。 - pub upgrade会丢弃现有的pubspec.lock文件,然后像初始的pub get一样工作。
因此,在应用中运行pub get将不会意外地获取新版本。与同事合作时,每个人在运行pub get并将锁定文件包含在版本控制中时都将获取相同的版本。 了解Dart中的锁定文件更多信息
最佳实践
因为Dart团队建议一些最佳实践来进行版本控制,所以我想确保直接包括它们在这里:
使用caret语法 使用版本范围指定依赖关系,例如^1.6.3是一种良好的实践,因为它允许pub工具在可用时选择软件包的新版本。此外,它根据假设,即软件包使用语义化版本,将上限设置为允许的版本,其中任何路径版本为1.x的版本都是兼容的,但是新版本2.x将是不与1.x版本在语义上兼容的主要升级。
依赖于最新的稳定软件包版本 使用pub upgrade更新到您的pubspec允许的最新软件包版本。要查找应用程序或软件包中未使用最新稳定版本的依赖项,请使用pub outdated
每当更新软件包依赖项时进行测试 如果运行pub upgrade而不更新您的pubspec,则API应保持不变,并且代码应像以前一样运行-但请进行测试以确保。如果修改了pubspec并更新到新的主要版本,则可能会遇到破坏性更改,因此需要进行更彻底的测试。

许多 Dart 包没有遵循语义化版本控制规范,因此我们在次要版本更新中可能会遇到破坏性变更。我在思考现在哪个影响更大:不从遵循此版本控制规范的库获取热修复,还是在重新构建相同的构建时从不遵循此规范的库获取破坏性变更。 - raphire
@raphire,只要pubspec.lock文件没有更改,你将始终获得完全相同的软件包版本。除非你运行pub upgrade.. 你可以参考我在答案中提到的最佳实践。 - creativecreatorormaybenot

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