Pub 工作区(monorepo 支持)
在处理项目时,你可能会在同一个版本控制仓库(一个_monorepo_)中开发多个 Dart 包。
例如,你的目录结构可能如下所示:
/
packages/
shared/
pubspec.yaml
pubspec.lock
.dart_tool/package_config.json
client_package/
pubspec.yaml
pubspec.lock
.dart_tool/package_config.json
server_package/
pubspec.yaml
pubspec.lock
.dart_tool/package_config.json
这种设置有一些缺点:
- 你需要为每个包运行一次
dart pub get
。 - 你有可能会为每个包使用不同的依赖版本,这在包之间切换上下文时会导致混乱。
- 如果你在 IDE 中打开根文件夹,Dart 分析器会为每个包创建单独的分析上下文,从而增加内存使用量。
Pub 允许你使用单个共享解析来组织你的仓库作为一个 工作区 ,用于所有包。 对于大型仓库,使用工作区可以减少分析所需的内存量,从而提高性能。
要创建一个工作区:
在仓库根目录添加一个包含
workspace
条目的pubspec.yaml
文件,列出仓库中包的路径(工作区包):yamlname: _ publish_to: none environment: sdk: ^3.6.0 workspace: - packages/helper - packages/client_package - packages/server_package
对于每个现有的
pubspec.yaml
文件,确保它们的 SDK 约束至少为^3.6.0
并添加resolution
条目:yamlenvironment: sdk: ^3.6.0 resolution: workspace
在仓库中的任何位置运行
dart pub get
。这将:- 在根
pubspec.yaml
旁边创建一个单一的pubspec.lock
文件,其中包含所有工作区包的dependencies
和dev_dependencies
的解析结果。 - 创建一个单一的共享
.dart_tool/package_config.json
文件,用于将包名映射到文件位置。 - 删除工作区包旁边任何其他现有的
pubspec.lock
和.dart_tool/package_config.json
文件。
- 在根
现在文件结构如下所示:
/
packages/
shared/
pubspec.yaml
client_package/
pubspec.yaml
server_package/
pubspec.yaml
pubspec.yaml
pubspec.lock
.dart_tool/package_config.json
工作区包之间的相互依赖
#如果任何工作区包相互依赖,它们将自动解析为工作区中的那个包,而不管其来源如何。
例如, packages/client_package/pubspec.yaml
可能依赖于 shared
:
dependencies:
shared: ^2.3.0
在工作区内解析时,将使用 shared
的 本地 版本。
但是, shared
的本地版本仍然必须匹配约束( ^2.3.0
)。
但是,当包作为依赖项被使用而不作为工作区的一部分时,将使用原始来源(此处隐式为 hosted
)。
因此,如果 client_package
发布到 pub.dev,并且有人依赖于它,他们将获得 shared
的托管版本作为传递依赖。
工作区中的依赖项覆盖
#工作区包中的所有 dependency_overrides
部分都将被尊重。你也可以在任何工作区 pubspec.yaml
文件旁边放置一个 pubspec_overrides.yaml
文件。
你只能在工作区中覆盖一次包。为了保持覆盖的组织性,最好将 dependency_overrides
保持在根 pubspec.yaml
中。
在特定工作区包中运行命令
#一些 pub 命令,例如 dart pub add
和 dart pub publish
,是在“当前”包上操作的。你可以更改目录,或者使用 -C
将 pub 指向一个目录:
$ dart pub -C packages/client_package publish
# 等同于
$ cd packages/client_package ; dart pub publish ; cd -
临时在工作区之外解析包:
#有时你可能希望单独解析工作区包,例如为了验证其依赖项约束。
一种方法是创建一个 pubspec_overides.yaml
文件来重置 resolution
设置,如下所示:
# packages/client_package/pubspec_overrides.yaml
resolution:
现在,在 packages/client_package
内部运行 dart pub get
将创建一个独立的解析结果。
列出所有工作区包
#你可以运行 dart pub workspace list
来列出工作区的包。
$ dart pub workspace list
Package Path
_ ./
client_package packages/client_package/
server_package packages/server_package/
shared packages/shared/
除非另有说明,否则本网站上的文档反映的是 Dart 3.6.0。页面最后更新于 2025-02-05。 查看源代码 或 报告问题.