「这是我参加11月更文应战的第4天,活动概况查看:2021最终一次更文应战」。

上一篇我们留下一个问题:为什么我们有时会添加刺进符号在我们的依托库版别之前:

dependencies:
    flutter_bloc: ^7.3.3

这个符号有什么效果?它与pubspec.lock文件有什么联系?

活络的依托库版别

正如Dart官方文档中所见,有几种不同的方式来定义的版别:

  • any容许任何版别,相当于一个空版别捆绑,但更明确。虽然any是容许的,但我们不引荐它。
  • 1.2.3 详细版别号将依托库依托库固定为仅容许该切当版别。尽或许避免运用它,由于它会导致用户的版别确定,并使他们难以将您的库与其他依托它的库一同运用。
  • <,>,<=,>=– 容许我们选择更低、更高、更低且等于或更高且等于规矩版其他版别

假设我们想要有活络性和稳定性的确保,我们应该考虑运用运用刺进符号语法, 或^1.2.3

^version 表明确保向后兼容指定版其他全部版其他规模。

因此,遵从语义版别指南 和 刺进符号语法,这意味着:

  • 关于没有首要版其他依托库,例如0.1.130.0.2-> 刺进符号将找到包含在同一非有必要版别中的依托库。所以^0.1.13会满足>= 0.1.1 < 0.2.0之间的全部版别。
  • 关于具有首要版其他依托库,例如7.3.0,刺进符号将查找包含在同一首要版别中的依托库。所以^7.3.0会满足>=7.3.0 <7.3.3之间的全部版别。

现在,这引出了两个不同的问题:

  1. Dart 什么时候更新我们的依托库版别?
  2. 它如何为项目选择合适的版别?
  3. 在哪里能够找到与项目一同运用的特定版别?

要回答这些问题,我们有必要了解什么是pubspec.lock文件。

pubspec.lock 文件的分析

我们创建一个新项目,提交它,然后添加一个新的依托库:

dependencies:
  flutter_bloc: ^7.3.0

之后,我们工作flutter pub get并查看pubspec.lock文件的差异内容:

flutter_bloc:
    dependency: "direct main"
    description:
      name: flutter_bloc
      url: "https://pub.flutter-io.cn"
    source: hosted
    version: "7.3.3"
bloc:
    dependency: transitive
    description:
      name: bloc
      url: "https://pub.flutter-io.cn"
    source: hosted
    version: "7.2.1"
  • 在顶部,我们有库称谓:flutter_bloc
  • 接下来,我们有dependency类型,direct:直接依托库,还有一个值是transitive:依托库的依托库(直接依托库)。
  • description将相关的依托性的类型的其他一些信息(GIT,本地或保管)
  • source奉告我们如何将依托库添加到项目中。在本例中,我们通过 pub.dev(保管)添加了它,但我们也能够运用pathgit;
  • 最终version将奉告我们正在运用的详细版别号是多少。

假设我们仔细查看version,我们会看到,虽然我们在pubspec.yamlversion 中定义的是^7.3.0但从pubspec.lock文件中解析出来的版别是7.3.3,这意味着 Dart 能够承受并运用最新版其他库。

为什应该运用

假设我们只运用一个依托,运用的优点只是让我们具有最新最好的版别。但是,在我们的依托库中运用还有另一个很好的理由——它容许 Dart 满足活络地选择一个与全部瞬态(或依托库的依托库)依托库共同的依托库版别。

幻想一下以下场景 – 您在项目中运用最新版其他库 –bloc: ^6.0.0.但是,您还运用了 flutter_bloc 的库,它也依托于bloc,但它运用的是更新的版别:bloc: 7.2.1.

dependencies:
  flutter_bloc: ^7.3.0
  bloc: ^6.0.0

假设我们选择运用bloc切当的版别bloc: ^6.0.0,此时Dart 将无法找到一同满足这两个捆绑的版别。因此当我们工作flutter pub get我们将看到以下差错音讯:

[new_test] flutter pub get
Running "flutter pub get" in new_test...
Because new_app depends on flutter_bloc ^7.3.0 which depends on bloc ^7.2.0, bloc ^7.2.0 is required.
So, because new_app depends on bloc ^6.0.0, version solving failed.
pub get failed (1; So, because new_app depends on bloc ^6.0.0, version solving failed.)
exit code 1

处理这个问题的唯一办法就是让这两个库和项目依托于一个版别,让他们找到一个版别,一同满足。

假设我们无法在运用的依托库中添加处理这个问题,那么我们能够在项目中pubspec.yaml文件中运用dependency_overrides去处理这个问题,正如我们在Flutter 项目结构篇之- pubspec.yaml叙述的那样。

晋级我们的版别

我们能够看到通过工作flutter pub getpubspec.lock文件并没有发生改动,说明flutter pub get对我们的库没有进行任何更新,那么我们如何更新我们的依托库呢?

答案是运用flutter pub upgrade

dependencies:
  flutter_bloc: ^7.0.0

假设我们工作,flutter pub upgrade我们会看到全部依托库都将具有更高版别,契合以下标准:

[new_test] flutter pub upgrade
Resolving dependencies...
bloc 7.2.1
> flutter_bloc 7.3.3 (was 7.0.0)
> provider 6.0.1 (was 5.0.0)
sky_engine 0.0.99 from sdk flutter
....
Changed 2 dependencies!
5 packages have newer versions incompatible with dependency constraints.
Try `flutter pub outdated` for more information.
exit code 0

通过看到上面的差异,我们能够看到这些版别已更新到较新的版别。

但是假设我们不想晋级全部的依托库呢?假设我们只想的晋级某一个依托库呢? 那我们运用flutter pub upgrade <package_name>.

让我们通过运用来检验它flutter pub upgrade shared_preferences

Resolving dependencies...
  ....
  flutter_bloc 7.0.0 (7.3.3 available)
  ....
> shared_preferences 2.0.8 (was 2.0.0)
 .....
Downloading shared_preferences 2.0.8...
Changed 1 dependency!
7 packages have newer versions incompatible with dependency constraints.
Try `flutter pub outdated` for more information.

正如我们所看到的,指令行奉告我们:虽然有一个更新的版别可用于flutter_bloc,但它没有被晋级。

查看flutter pub upgrade指令的最终一行,我们看到它提到了该flutter pub outdated指令。假设我们期望pubspec.yaml直接更新我们的文件,能够用此指令查看我们全部的依托库最新和兼容版别:

flutter pub outdated
Showing outdated packages.
[*] indicates versions that are not the latest available.
Package Name  Current   Upgradable  Resolvable  Latest   
direct dependencies:
flutter_bloc  *7.0.0    *7.0.0      7.3.3       7.3.3    
dev_dependencies: all up-to-date.
transitive dependencies:
characters    *1.1.0    *1.1.0      *1.1.0      1.2.0    
provider      *5.0.0    *5.0.0      6.0.1       6.0.1    
vector_math   *2.1.0    *2.1.0      *2.1.0      2.1.1    
transitive dev_dependencies:
async         *2.8.1    *2.8.1      *2.8.1      2.8.2    
matcher       *0.12.10  *0.12.10    *0.12.10    0.12.11  
test_api      *0.4.2    *0.4.2      *0.4.2      0.4.7    
2  dependencies are constrained to versions that are older than a resolvable version.
To update these dependencies, edit pubspec.yaml, or run `flutter pub upgrade --major-versions`.

pubspec.lock文件在运用中的重要性

假设我们正在开发一个项目,该lock文件确保每个有权访问该项目的人都能够运用我们正在运用的相同版其他库来工作它。它是我们运用的真实版其他“真相来历”。

这意味着即便我们运用符号,我们也不会在不同机器上有相同依托库的不同解析版别,这使得与其他开发人员并行开发项目变得更加简单。

但是我们查看Dart 官方文档中的What not to commit会发现官方不主张我们提交pubspec.lock文件的源代码管理服务器中。由于库应该支持一系列依托库版别,依托库的直接依托库的版别捆绑应尽或许放宽,一同仍确保依托库将与检验的版别兼容性。

Lockfile

结论

现在我们认识到pubspec.lock的重要性:能够明确的来看到我们的项目的依托联系。
并且也知道了为什么在声明依托库时应该考虑运用符号(它使我们更加活络,具有更少的依托库差错,并检验我们正在运用的库的更新版别)。