目录

dart pub get 命令

Get 命令是 Pub 工具 中的一个命令。

$ dart pub get [options]

该命令获取所有在当前工作目录下的 pubspec.yaml 文件中列出的依赖项,以及这些依赖项的 间接依赖项。例如:

$ dart pub get
Resolving dependencies...
Got dependencies!

如果 Pub 的系统缓存 中还没有该依赖项,则 dart pub get 命令会在必要时下载该依赖项并更新缓存。该命令会在 .dart_tool/ 文件夹下创建一个 package_config.json 文件并将之映射到 Pub 的系统缓存中。

一旦依赖获取完毕,就可以在 Dart 代码中引用。例如,假如 package 依赖了名为 test 的 package,则可以使用该 package 下的资源:

import 'package:test/test.dart';

dart pub get 命令获取新依赖项后会写入一个 lockfile 文件以确保下次执行该命令时会使用相同的依赖项版本。应用型的 package 应该总是签入该 lockfile 文件以控制来源;从而确保在将 package 部署到生产环境时所有的依赖项对于所有开发者而言都是相同的版本。库类型的 package 则不需要签入 lockfile 文件,因为它们可能需要使用到不同的依赖项版本。

如果 lockfile 已经存在,dart pub get 命令会尽可能地使用锁定的依赖项版本。如果某个依赖项没有被锁定,则 pub 会获取所有 限定的版本 中最新的那个依赖项版本。这是 dart pub get 命令与 dart pub upgrade 命令最大的不同点,后者总是会去尝试使用依赖项的最新版本。

Package 解析

默认情况下,pub 会在 .dart_tool/ 文件夹下创建一个 .packages 文件用于映射 package 名到位置 URI。

获取一个新的依赖项

如果在执行 dart pub get 命令前将某个依赖添加至 pubspec 文件中,则在执行该命令后会更新依赖项以及其间接依赖的其它依赖项。但是,pub 不会更改哪些已经存在的依赖项除非有必要获取它们的新版本。

移除一个依赖项

如果在 dart pub get 命令前从 pubspec 文件移除了某个依赖项,则在执行该命令后代码使用到该依赖项的相关导入将变得不可用。所有该依赖项依赖的间接依赖项也同时会被移除,只要这些间接依赖项没有没其它的依赖项所依赖。移除某个依赖项不会对已经获得的依赖项版本产生任何影响。

系统 Package 缓存

依赖项通过网络从类似 Git 仓库和 Pub 网站 下载并存储在一个 系统级的缓存 中。这意味着如果多个 Package 使用了相同依赖项的相同版本,它就不再需要通过网络下载,而仅仅只需从本地缓存获取即可。

默认情况下,Pub 缓存存储在你的用户目录(macOS 和 Linux)或 %APPDATA%\Pub\Cache 目录下的 .pub-cache 子目录中(Windows,不同版本的 Windows 操作系统可能会不一样)。你可以在运行 Pub 相关命令前通过 PUB_CACHE 系统环境变量配置你想要的缓存存储目录。

离线检索

在没有网络的情况下你也依然可以运行 dart pub get 命令。因为 pub 会将 Package 下载到一个统一的缓存区并将其与系统上其它的 package 进行共享,如果你所需的 package 是一个使用频率很高的 package,那么很有可能它已经被其它 package 在使用时下载到统一缓存区中了,此时你可以直接依赖使用它。

但是,默认情况下,dart pub get 命令会总是尝试获取线上的依赖版本,因此 pub 可以确定依赖项是否有更新的版本。如果你不想 pub 去线上检查,可以使用 --offline 命令参数让该命令在离线模式下执行。在离线模式下,pub 只会从本地缓存区查找已经下载到的可用 Package。

切记 pub 会生成一个 lockfile 文件。如果缓存中某些依赖项目有且只有一个版本且非常旧,离线模式下执行 dart pub get 命令则依然会使用那些旧的版本。下次当你有可用的网络时,可以使用 dart pub upgrade 命令将其更新到最新版本。

选项

你可以查阅 全局选项 获取 pub 命令所支持的命令选项。

--[no-]offline

默认情况下,pub 会从网络上拉取 package (--no-offline)。若你想使用本地的 package,使用 --offline 参数。想了解更多细节,请查看 离线获取 package.

--dry-run-n

打印出可能变化的依赖,但不会实际作出更改。如果你想要在变更前进行分析,该命令非常有用。

--[no-]precompile

默认情况下,pub 将预编译直接依赖的 package 中的可执行文件 (--precompile)。若你不需要预编译,请使用 --no-precompile

--legacy-packages-file

如果你正在使用 Dart 2.18 并且使用了一些依赖于已经停止支持了的 .packages 文件,请使用 --legacy-packages-file 来生成一个 .packages 文件,这个命令行标记将会在 Dart 2.19 中被移除。