深色模式
Flutter 使用 pub workspace(monorepo支持)
Dart 3.6 引入了 pub workspace 功能,旨在简化管理包含多个 Dart 包的单一版本控制仓库(即 monorepo)。
创建工作区
- 在仓库根目录添加
pubspec.yaml
文件:该文件应包含workspace
条目,列出仓库中各个包的路径:
yaml
name: _
publish_to: none
environment:
sdk: ^3.6.0
workspace:
- packages/helper
- packages/client_package
- packages/server_package
- 更新各包的
pubspec.yaml
文件:确保每个包的 SDK 约束至少为^3.6.0
,并添加resolution
条目:
yaml
environment:
sdk: ^3.6.0
resolution: workspace
- 运行
dart pub get
:在仓库任意位置执行此命令,将:
- 在根目录生成一个统一的
pubspec.lock
文件,包含所有工作区包的依赖解析。 - 创建共享的
.dart_tool/package_config.json
文件,映射包名到文件位置。 - 删除各包目录下现有的
pubspec.lock
和.dart_tool/package_config.json
文件。 执行后,目录结构如下:
/
packages/
helper/
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
包:
yaml
dependencies:
shared: ^2.3.0
当在工作区内部解析时,将使用 shared
的本地版本。
不过,本地版本的 shared
仍然需要满足版本约束(如 ^2.3.0
)。
但是,当该包(例如 client_package
)作为依赖被使用且不在工作区中时,将会使用原始的来源版本(此处默认为托管在 pub.dev
的版本)。
因此,如果 client_package
被发布到 pub.dev
,并且有人依赖它,他们将会通过传递依赖获得托管版本的 shared
。
工作区中的依赖覆盖
工作区中所有包的 dependency_overrides
部分都会被遵循。同时,你也可以在任意工作区包的 pubspec.yaml
文件旁边放置一个 pubspec_overrides.yaml
文件。
在工作区中,每个包只能被覆盖一次。为了便于管理,建议将所有的 dependency_overrides
集中放在根目录的 pubspec.yaml
文件中。
在特定包中运行命令
对于需要在特定包中执行的命令(如 dart pub add
或 dart pub publish
),可以使用 -C 参数指定目录:
bash
dart pub -C packages/client_package publish
临时在工作区外解析包
若需单独解析某个工作区包,可在其目录下创建 pubspec_overrides.yaml
文件,重置 resolution
设置:
yaml
# packages/client_package/pubspec_overrides.yaml
resolution:
然后在该包目录中运行 dart pub get
,将创建独立的依赖解析。
列出所有工作区包
使用以下命令可列出工作区中的所有包:
bash
dart pub workspace list
输出示例:
Package Path
_ ./
client_package packages/client_package/
server_package packages/server_package/
helper packages/helper/