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 上显示?