【发布时间】:2021-05-17 22:40:27
【问题描述】:
我想知道如何在我的 Flutter 应用程序中解析 Dart 包版本。
说,我有一个依赖 foo 并声明一个这样的依赖:
dependencies:
foo: ^1.2.3
Dart Pub 如何知道要解决哪个版本/有新版本可用时会发生什么?
另外,如果我想将我的 Flutter 插件发布到 pub.dev,我该如何决定何时增加版本的哪一部分?
【问题讨论】:
我想知道如何在我的 Flutter 应用程序中解析 Dart 包版本。
说,我有一个依赖 foo 并声明一个这样的依赖:
dependencies:
foo: ^1.2.3
Dart Pub 如何知道要解决哪个版本/有新版本可用时会发生什么?
另外,如果我想将我的 Flutter 插件发布到 pub.dev,我该如何决定何时增加版本的哪一部分?
【问题讨论】:
所有这些都可以追溯到 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 并更新到新的主要版本,那么您可能会遇到重大更改,因此您需要进行更彻底的测试。
【讨论】: