Flutter包依赖的四种方法

https://dart.dev/tools/pub/dependencies

概念

依赖是一个pub包管理的核心概念,它在pubspec.yaml文件中被指定。开发人员只需要把自己直接依赖的包列出来,不需要写间接依赖的包,pub会帮我们处理那些间接依赖,可以使用pub deps命令或者flutter packages pub deps命令查看包依赖信息。

用法

1
2
3
4
5
dependencies:
[依赖的包名]:
[source]: 告诉pub这个包如何被定位,不是一个具体的pub siet或者是git url, 而是获取包的方式,这些方式有sdk、Hosted packages、Git packages、Path packages
[description]: 让pub定位到source的额外信息
version: 包的版本号

不同source的写法

SDK(表明这个包来自于哪个sdk,使用这个参数要求dart版本必须在1.19.0之上)

1
2
3
4
dependencies:
flutter_driver:
sdk: flutter
version: ^0.0.1

Hosted packages(从pub site上下载的包)

托管包是可以从 pub.dev 站点(或另一个使用相同 API 的 HTTP 服务器)下载的包。以下是声明对托管包的依赖关系的示例:

1
2
dependencies:
transmogrify: ^1.4.0

此示例指定您的包依赖于名为 transmogrify 的托管包,并且适用于从 1.4.0 到 2.0.0 的任何版本(但不是 2.0.0 本身)。

如果要使用自己的包服务器,可以使用指定其 URL 的描述:

1
2
3
4
5
6
dependencies:
transmogrify:
hosted:
name: transmogrify
url: http://your-package-server.com
version: ^1.4.0

Git packages(从git上获取的包)

需要使用尚未正式发布的软件包。也许您的软件包本身仍在开发中,并且正在使用同时正在开发的其他软件包。为了更容易,您可以直接依赖存储在 Git 存储库中的包。

1
2
3
dependencies:
kittens:
git: https://github.com/munificent/kittens.git

这里的git表示这个包是用Git找到的,后面的URL就是可以用来克隆这个包的Git URL。 即使包 repo 是私有的,如果您可以使用 SSH 连接到 repo,那么您可以使用 repo 的 SSH URL 依赖包:

1
2
3
dependencies:
kittens:
git: git@github.com:munificent/kittens.git

如果要依赖特定的提交、分支或标签,请添加 ref 参数:

1
2
3
4
5
dependencies:
kittens:
git:
url: git@github.com:munificent/kittens.git
ref: some-branch

Pub 假定该包位于 Git 存储库的根目录中。要在 repo 中指定不同的位置,请使用 path 参数:

1
2
3
4
5
dependencies:
kittens:
git:
url: git@github.com:munificent/cats.git
path: path/to/kittens

该路径相对于 Git 存储库的根目录。

Path packages(依赖的本地文件)

1
2
3
dependencies:
transmogrify:
path: /Users/me/transmogrify

这表示 transmogrify 的根目录是 /Users/me/transmogrify。对于此依赖项,pub 会直接生成指向所引用包目录的 lib 目录的符号链接。您对依赖包所做的任何更改都会立即看到。不需要每次更改依赖包时都运行 pub。

相对路径是允许的,并且被认为是相对于包含您的 pubspec 的目录。

路径依赖对本地开发很有用,但在与外界共享代码时不起作用——不是每个人都可以访问您的文件系统。因此,如果包的 pubspec 中有任何路径依赖项,则您无法将包上传到 pub.dev 站点。

相反,典型的工作流程是:

  • 在本地编辑您的 pubspec 以使用路径依赖项。
  • 处理主包及其依赖的包。
  • 一旦它们都正常工作,就发布依赖包。
  • 将您的 pubspec 更改为指向其依赖项的现在托管版本。
  • 如果需要,也发布您的主包。

不同的版本号约束写法

semantic versioning

例子:>=1.2.3、>1.2.3、<=1.2.3、<1.2.3、'>=1.2.3 <2.0.0'

Caret syntax(要求dart版本号在1.8.3及以上,并且dart会把^转换成semantic versioning的形式)

例如: ^1.2.3等价于'>=1.2.3 <2.0.0',^0.1.2等价于'>=0.1.2 <0.2.0'。

依赖类型

dependencies

项目中要依赖的包,例子如下:

1
2
3
4
dependencies:
path: ^1.3.0
collection: ^1.1.0
string_scanner: ^0.1.2

dev_dependencies

放一些跟项目逻辑无关的依赖包,比如和test相关的, 例子如下:

1
2
dev_dependencies:
test: '>=0.5.0 <0.12.0'

dependency_overrides

覆盖dependencies包依赖,例子如下:

1
2
3
dependency_overrides:
transmogrify:
path: ../transmogrify_patch/