Pub 工作區(單一程式碼儲存庫支援)
在處理專案時,您可能會在同一個版本控制儲存庫(單一程式碼儲存庫)中開發多個 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 可讓您使用單一共享解析來將儲存庫組織為工作區,以用於您的所有套件。為大型儲存庫使用工作區可減少分析所需的記憶體量,進而提高效能。
建立工作區的方法:
在儲存庫根目錄中新增一個
pubspec.yaml
,並包含一個workspace
項目,列舉儲存庫套件(工作區套件)的路徑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_overrides.yaml
檔案放置在任何工作區 pubspec.yaml
檔案旁邊。
您只能在工作區中覆寫套件一次。為了讓覆寫保持有條理,最好將 dependency_overrides
保留在根 pubspec.yaml
中。
在特定的工作區套件中執行指令
#某些 pub 命令(例如 dart pub add
和 dart pub publish
)會對「目前」套件進行操作。您可以變更目錄,或使用 -C
將 pub 指向目錄
$ dart pub -C packages/client_package publish
# Same as
$ 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。頁面上次更新時間為 2024-12-10。 檢視原始碼 或 回報問題。