与 Android 中的 JCenter/Maven、iOS 中的 CocoaPods/SPM/Carthage、前端中的 npm 库类似,Dart 提供了官方的包仓库 Pub用来管理代码和资源。
在 Dart 中,库和应用都属于包。pubspec.yaml
是包的配置文件,包含了包的元数据(比如,包的名称和版本)、运行环境(也就是 Dart SDK 与 Fluter SDK 版本)、外部依赖、内部配置(比如,资源管理)。
下面我们看一个应用配置文件,其版本为 1.0,Dart 运行环境支持 2.1 至 3.0 之间,依赖 flutter
和 cupertino_icon
:
name: flutter_app_example #应用名称
description: A new Flutter application. #应用描述
version: 1.0.0
#Dart运行环境区间
environment:
sdk: ">=2.1.0 <3.0.0"
#Flutter依赖库
dependencies:
flutter:
sdk: flutter
cupertino_icons: ^0.1.1
运行环境和依赖库 cupertino_icons
冒号后面的部分是版本约束信息,由一组空格分隔的版本描述组成,可以支持指定版本、版本号区间,以及任意版本这三种版本约束方式。
pubspec.yaml
中,除了可以用这种方式引用pub公开发布的第三方包外,我们还可以使用本地路径或 Git 地址的方式进行包声明
dependencies:
package1:
path: ../package1/ #路径依赖
date_format:
git:
url: https://github.com/xxx/package2.git #git依赖
pub除了管理第三方依赖,包管理工具 Pub 的另一个职责是,找出一组同时满足每个包版本约束的包版本。包版本一旦确定,接下来就是下载对应版本的包了。
对于 dependencies 中的不同数据源,Dart 会使用不同的方式进行管理,最终会将远端的包全部下载到本地。比如,对于 Git 声明依赖的方式,Pub 会 clone Git 仓库;对于版本号的方式,Pub 则会从 pub.dartlang.org 下载包。如果包还有其他的依赖包,比如 package1
包还依赖 package3
包,Pub 也会一并下载。
然后,在完成了所有依赖包的下载后,Pub 会在应用的根目录下创建 .packages
文件,将依赖的包名与系统缓存中的包文件路径进行映射,方便后续维护。
最后,Pub 会自动创建 pubspec.lock
文件。pubspec.lock
文件的作用类似 iOS 的 Podfile.lock
或前端的 package-lock.json
文件,用于记录当前状态下实际安装的各个直接依赖、间接依赖的包的具体来源和版本号。
比较活跃的第三方包的升级通常比较频繁,因此对于多人协作的 Flutter 应用来说,我们需要把 pubspec.lock
文件也一并提交到代码版本管理中,这样团队中的所有人在使用这个应用时安装的所有依赖都是完全一样的,以避免出现库函数找不到或者其他的依赖错误。
除了提供功能和代码维度的依赖之外,包还可以提供资源的依赖。在依赖包中的 pubspec.yaml
文件已经声明了同样资源的情况下,为节省应用程序安装包大小,我们需要复用依赖包中的资源。
Image.asset('assets/placeholder.png', package: 'package4');