我想知道在我的Flutter应用程序中如何解析Dart包版本。
比如说,我有一个依赖项foo
并像这样声明一个依赖:
dependencies:
foo: ^1.2.3
Dart Pub如何确定要解析哪个版本/当新版本可用时会发生什么?
此外,如果我想将我的Flutter插件发布到pub.dev,我该如何决定何时增加版本的哪个部分?
所有这些都归结于Dart包版本控制,即Flutter插件没有区别。
它基于SemVer 2.0.0-rc.1
(语义化版本控制)。对于Dart包,约定的要点如下:
<1.0.0 |
>=1.0.0 |
---|---|
0.major.minor+patch |
major.minor.patch |
<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软件包版本控制文章中的解决共享依赖项部分。我将在此处查看版本解析的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 |
否 |
pubspec.lock
^1.6.3
是一种良好的实践,因为它允许pub工具在可用时选择软件包的新版本。此外,它根据假设,即软件包使用语义化版本,将上限设置为允许的版本,其中任何路径版本为1.x
的版本都是兼容的,但是新版本2.x
将是不与1.x
版本在语义上兼容的主要升级。pub upgrade
更新到您的pubspec允许的最新软件包版本。要查找应用程序或软件包中未使用最新稳定版本的依赖项,请使用pub outdated
。pub upgrade
而不更新您的pubspec,则API应保持不变,并且代码应像以前一样运行-但请进行测试以确保。如果修改了pubspec并更新到新的主要版本,则可能会遇到破坏性更改,因此需要进行更彻底的测试。
pubspec.lock
文件没有更改,你将始终获得完全相同的软件包版本。除非你运行pub upgrade
.. 你可以参考我在答案中提到的最佳实践。 - creativecreatorormaybenot