目錄

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 項目,列舉儲存庫套件(工作區套件)的路徑

    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.yaml 旁邊建立單一 pubspec.lock,其中包含所有工作區套件的所有 dependenciesdev_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

yaml
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 adddart 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 設定,如下所示

yaml
# 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/