Dart 包版本如何工作以及我应该如何对我的 Flutter 插件进行版本控制?

Posted

技术标签:

【中文标题】Dart 包版本如何工作以及我应该如何对我的 Flutter 插件进行版本控制?【英文标题】:How do Dart Package Versions work & how should I version my Flutter Plugins? 【发布时间】:2021-05-17 22:40:27 【问题描述】:

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

说,我有一个依赖 foo 并声明一个这样的依赖:

dependencies:
  foo: ^1.2.3

Dart Pub 如何知道要解决哪个版本/有新版本可用时会发生什么?


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

【问题讨论】:

【参考方案1】:

Dart 包版本控制

所有这些都可以追溯到 Dart 包版本控制,即 Flutter 插件没有区别。

它基于SemVer 2.0.0-rc.1 (Semantic Versioning)。对于 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

Learn more about Dart's package versioning.

解决版本

要基本了解版本解决试图解决的问题,您可以阅读 Dart 包版本控制文章的Resolving shared dependencies 部分。我将在这里看到的版本解析方面是caret syntax

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 规范)。你可以找到the source code for Pub's pub_semver tool on GitHub。它声明预发布版本与插入符语法匹配(也不与传统语法匹配):

^1.0.0 matches version?
1.4.2 yes
1.5.0-beta yes
2.0.0-alpha no
2.0.0 no

Learn more about Dart's package dependencies.

pubspec.lock

我很快想提一下 Pubspec 锁定文件在 Dart 中解决依赖关系的作用。

我认为有一种直接的方式可以定义如何获取包版本:

pub get 没有现有的pubspec.lock(初始获取)将获取可能的最新版本(根据上述规则并满足共享依赖项的所有直接和传递约束)。 pub get 现有的pubspec.lock 文件将优先选择锁定文件中的锁定版本而不是最新版本(如果它们仍然满足自上次获取以来可能新引入的依赖项的约束)。 pub upgrade 丢弃现有的 pubspec.lock 文件,然后以与初始 pub get 相同的方式运行。

因此,在您的应用中运行 pub get 不会意外获取新版本。并且在和同事一起工作的时候,在运行pub get,并且在版本控制中包含了锁文件的情况下,每个人都会根据pubspec.lock文件获取相同的版本。

Learn more about lockfiles in Dart.

最佳做法

因为the Dart team recommends some best practices for versioning,所以我想确保将它们直接包含在此处:

使用caret syntax 使用版本范围指定依赖项,例如 ^1.6.3 是一种很好的做法,因为它允许 pub 工具在包的更新版本可用时选择它们。此外,基于包使用semantic versions 的假设,它对允许的版本设置了上限,其中任何版本的路径版本为1.x 是兼容的,但新版本2.x 将是一个重大升级'在语义上与 1.x 版本不兼容。

取决于最新的稳定包版本 使用 pub upgrade 更新到您的 pubspec 允许的最新软件包版本。要识别您的应用或包中未在最新稳定版本上的依赖项,请使用 pub outdated

更新包依赖项时进行测试 如果您在不更新 pubspec 的情况下运行 pub upgrade,则 API 应该保持不变,并且您的代码应该像以前一样运行 - 但要进行测试以确保。如果您修改 pubspec 并更新到新的主要版本,那么您可能会遇到重大更改,因此您需要进行更彻底的测试。

【讨论】:

以上是关于Dart 包版本如何工作以及我应该如何对我的 Flutter 插件进行版本控制?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用我的 dart 包私有而不在 pub dart lang 上显示?

这些函数返回值在 Dart 中是如何工作的?

如何在浏览器中运行颤振单元测试?

Flutter/Dart - 关于如何对未来进行故障排除的建议?

为啥文本元素居中以及如何在 Dart 中将其与右侧对齐

我如何在 VSCode 上更改我的 dart-sdk