在 Flutter 中如何通过配置文件来管理工程代码依赖。

Pub

Dart 的包管理工具: pub

  • 包: 实际上就是一个包含了 pubspec.yaml 文件的目录
  • Dart 提供了官方的包仓库 Pub

Dart 提供包管理工具 Pub 的真正目的是,让你能够找到真正好用的、经过线上大量验证的库,复用他人的成果来缩短开发周期,提升软件质量。
**
在 Dart 中,库和应用都属于包。pubspec.yaml 是包的配置文件,包含了包的元数据(比如,包的名称和版本)、运行环境(也就是 Dart SDK 与 Fluter SDK 版本)、外部依赖、内部配置(比如,资源管理)。

在下面的例子中,我们声明了一个 flutter_app_example 的应用配置文件,其版本为 1.0,Dart 运行环境支持 2.1 至 3.0 之间,依赖 flutter 和 cupertino_icon:

  1. name: flutter_app_example #应用名称
  2. description: A new Flutter application. #应用描述
  3. version: 1.0.0
  4. #Dart运行环境区间
  5. environment:
  6. sdk: ">=2.1.0 <3.0.0"
  7. #Flutter依赖库
  8. dependencies:
  9. flutter:
  10. sdk: flutter
  11. cupertino_icons: ">0.1.1"
  • 对于包,我们通常是指定版本区间,而很少直接指定特定版本,因为包升级变化很频繁,如果有其他的包直接或间接依赖这个包的其他版本时,就会经常发生冲突。
  • 对于运行环境,如果是团队多人协作的工程,建议将 Dart 与 Flutter 的 SDK 环境写死,统一团队的开发环境,避免因为跨 SDK 版本出现的 API 差异进而导致工程问题

基于版本的方式引用第三方包,需要在其 Pub 上进行公开发布,我们可以访问https://pub.dev/来获取可用的第三方包。而对于不对外公开发布,或者目前处于开发调试阶段的包,我们需要设置数据源,使用本地路径或 Git 地址的方式进行包声明。

在下面的例子中,我们分别以路径依赖以及 Git 依赖的方式,声明了 package1 和 package2 这两个包:

  1. dependencies:
  2. package1:
  3. path: ../package1/ #路径依赖
  4. date_format:
  5. git:
  6. url: https://github.com/xxx/package2.git #git依赖

除了管理第三方依赖,包管理工具 Pub 的另一个职责是,找出一组同时满足每个包版本约束的包版本。包版本一旦确定,接下来就是下载对应版本的包了。

Pub 会在应用的根目录下创建.packages 文件,将依赖的包名与系统缓存中的包文件路径进行映射,方便后续维护。

最后,Pub 会自动创建 pubspec.lock 文件, 用于记录当前状态下实际安装的各个直接依赖、间接依赖的包的具体来源和版本号。

比较活跃的第三方包的升级通常比较频繁,因此对于多人协作的 Flutter 应用来说,我们需要把 pubspec.lock 文件也一并提交到代码版本管理中,这样团队中的所有人在使用这个应用时安装的所有依赖都是完全一样的,以避免出现库函数找不到或者其他的依赖错误。

除了提供功能和代码维度的依赖之外,包还可以提供资源的依赖. 在依赖包中的 pubspec.yaml 文件已经声明了同样资源的情况下,为节省应用程序安装包大小,我们需要复用依赖包中的资源。

在下面的例子中,我们的应用程序依赖了一个名为 package4 的包,而它的目录结构是这样的:

  1. pubspec.yaml
  2. └──assets
  3. ├──2.0x
  4. └── placeholder.png
  5. └──3.0x
  6. └── placeholder.png

**
其中,placeholder.png 是可复用资源。因此,在应用程序中,我们可以通过 Image 和 AssetImage 提供的 package 参数,根据设备实际分辨率去加载图像。

  • 使用其它包中声明的资源
  1. Image.asset('assets/placeholder.png', package: 'package4');
  2. AssetImage('assets/placeholder.png', package: 'package4');

例子

  1. 首先,我们在 Pub 上找到 date_format 这个包,确定其使用说明:

image.png

图 1 date_format 使用说明

  1. 接下来我们把 date_format 添加到 pubspec.yaml 中
  1. dependencies:
  2. date_format: 1.0.6
  1. 随后,IDE(Android Studio)监测到了配置文件的改动,提醒我们进行安装包依赖更新。于是,我们点击 Get dependencies,下载 date_format

image.png

图 2 下载安装包依赖

  1. 下载完成后,我们就可以在工程中使用 date_format 来进行日期的格式化了
  1. print(formatDate(DateTime.now(), [mm, '月', dd, '日', hh, ':', n]));
  2. //输出2019年06月30日01:56
  3. print(formatDate(DateTime.now(), [m, '月第', w, '周']));
  4. //输出6月第5周

精选留言

许童童

pubspec.yaml、.packages 与 pubspec.lock 这三个文件,在包管理中的具体作用是什么?
pubspec.yaml是声明依赖哪些包的配置文件
.packages是表示包在本地目录缓存的地址
pubspec.lock是把依赖锁死的文件
只有pubspec.yaml需要自己编写 其它两个文件会自动生成。

.packages 与 pubspec.lock 是否需要做代码版本管理呢?为什么?
pubspec.lock需要做版本管理,因为lock文件把版本锁定,统一工程环境
.packages不需要版本管理,因为跟本地环境有关,无法做到统一

作者回复: 赞