Dart包版本如何工作以及我应该如何版本我的Flutter插件?
我想知道我的 Flutter 应用程序中如何解决 Dart 包版本。
说,我有一个依赖项foo并声明一个这样的依赖项:
dependencies:
foo: ^1.2.3
Dart Pub 如何知道要解析哪个版本/新版本可用时会发生什么?
此外,如果我想将我的 Flutter 插件发布到 pub.dev,我如何决定何时增加版本的哪个部分?
回答
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。
了解有关 Dart 包版本控制的更多信息。
解决版本
要基本了解版本解析尝试解决的问题,您可以阅读Dart 包版本控制文章的解析共享依赖项部分。我将在此处查看的版本解析方面是插入符号语法。
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 |
如您所见,插入符号语法将匹配大于或等于当前版本但小于下一个主要版本的任何版本。
请注意,在 Dart 中,预发布版本的处理方式与正常版本不同(并非完全按照 SemVer 规范)。您可以在 GitHub 上找到Pubpub_semver工具的源代码。它声明预发布版本与插入符号语法不匹配(也不与传统语法匹配):
^1.0.0 |
匹配版本? |
|---|---|
1.4.2 |
是的 |
1.5.0-beta |
是的 |
2.0.0-alpha |
不 |
2.0.0 |
不 |
了解有关 Dart 包依赖项的更多信息。
pubspec.lock
我很快想提一下 Pubspec锁文件在 Dart 中解决依赖关系的作用。
我认为有一种直接的方式定义了如何获取包版本:
pub get没有退出pubspec.lock(初始获取)将获取最新的可能版本(根据上述规则并满足共享依赖项的所有直接和传递约束)。pub get使用现有pubspec.lock文件将更喜欢锁定文件中的锁定版本而不是最新版本(如果它们仍然满足自上次获取以来可能新引入的依赖项的约束)。pub upgrade丢弃现有pubspec.lock文件,然后以与初始pub get.
因此,pub get在您的应用中运行不会意外获取新版本。和同事一起工作时,每个人都会根据pubspec.lock运行时的文件获取相同的版本,pub get并将锁定文件包含在版本控制中。
了解有关 Dart 中锁文件的更多信息。
最佳实践
因为Dart 团队推荐了一些版本控制的最佳实践,所以我想确保将它们直接包含在此处:
使用插入符号语法
指定具有版本范围的依赖项^1.6.3是一种很好的做法,因为它允许 pub 工具在包可用时选择更新版本。此外,它对允许的版本设置了上限,基于包使用语义版本的假设,其中任何版本的路径版本1.x都兼容,但新版本2.x将是与1.x版本语义不兼容的主要升级。依靠最新的稳定版本的包
使用pub upgrade更新到您pubspec允许的最新版本的包。要识别您的应用程序或包中不在最新稳定版本上的依赖项,请使用pub outdated.每当更新包依赖项时进行测试
如果您在pub upgrade不更新 pubspec 的情况下运行,API 应该保持不变,您的代码应该像以前一样运行——但要进行测试以确保。如果您修改 pubspec 并更新到新的主要版本,那么您可能会遇到重大更改,因此您需要进行更彻底的测试。