跳到主內容

自定義包倉庫

dart pub 工具支援第三方包倉庫。包倉庫是託管 Dart 包的伺服器,供 dart pub 工具使用。預設的包倉庫 pub.dev 由 Dart 團隊運營,旨在方便 Dart 包的公開發布。包倉庫透過一個 hosted-url 標識,例如 https://dart-packages.example.com/

有時,自定義包倉庫可能對託管私有包很有用,包括以下一些場景:

  1. 在組織內部共享專有包。
  2. 在企業環境中嚴格控制依賴項。
  3. 沒有公共網際網路訪問許可權的安全環境。

使用 git 依賴項來託管私有包也很常見,但是 dart pub 工具不支援針對 git 倉庫解析版本;它只獲取 git 倉庫的特定修訂版本。因此,當多人協作時,通常最好使用私有包倉庫。

使用自定義包倉庫進行身份驗證

#

大多數自定義包倉庫都是需要身份驗證的私有包倉庫。為了對自定義包倉庫進行身份驗證,dart pub 工具會在請求中附加一個金鑰令牌。

你可以從自定義包倉庫獲取金鑰令牌,並透過手動或環境變數方式指定它。要手動指定金鑰令牌,請使用 dart pub token add 命令,該命令會提示你輸入令牌:

dart pub token add https://dart-packages.example.com
Enter secret token: [enter secret token]
Requests to "https://dart-packages.example.com" will now be authenticated using the secret token.

你還可以透過 --env-var 標誌告訴 dart pub 從環境變數中讀取令牌,包括在 CI 環境中:

dart pub token add https://dart-packages.example.com --env-var MY_SECRET_TOKEN
Requests to "https://dart-packages.example.com" will now be authenticated using the secret token stored in the environment variable "MY_SECRET_TOKEN".

這確保了 dart pub 不會實際將金鑰令牌儲存在其配置中,而只是儲存它應該從環境變數 $MY_SECRET_TOKEN 中讀取金鑰的事實。這降低了在 CI 作業之間共享執行環境時金鑰意外洩露的風險。

從自定義包倉庫檢索依賴項

#

要從自定義包倉庫獲取包,你必須在 pubspec.yaml 中使用 託管包的語法指定包的 hosted-url。例如:

yaml
dependencies:
  example_package:
    hosted: https://dart-packages.example.com
    version: ^1.4.0

在前面的示例中,package:example_packagehttps://dart-packages.example.com 獲取。如果此包倉庫需要身份驗證,請參閱使用自定義包倉庫進行身份驗證,瞭解如何驗證請求的更多資訊。

你還可以使用 dart pub add 命令和 --hosted 標誌從自定義包倉庫新增依賴項:

dart pub add example_package --hosted https://dart-packages.example.com

使用多個包倉庫

#

你還可以從不同的包倉庫獲取不同的依賴項,因為可以為每個依賴項指定 hosted-url

yaml
dependencies:
  # package retry is fetched from pub.dev (the default package repository)
  retry: ^3.0.0
  # package example_package is fetched from https://dart-packages.example.com
  example_package:
    hosted: https://dart-packages.example.com
    version: ^1.4.0

這使你可以在私有包倉庫上保留私有包,同時使用最新的公共包作為依賴項。

然而,如果你的依賴項需要來自不同倉庫的同名包,則很容易出現衝突。例如,如果包 retry 需要來自 pub.dev 的 meta,而 example_package 需要來自 https://dart-packages.example.commeta。因此,如果將任何包映象到私有包倉庫中,通常需要映象所有依賴項,並更新每個包的 dependencies 部分,或覆蓋預設包倉庫

釋出到自定義包倉庫

#

要將包釋出到自定義包倉庫而不是 pub.dev,請在 pubspec.yaml 中指定 publish_to 屬性。如果啟用了身份驗證,釋出將使用與檢索包相同的令牌身份驗證

要準備將包釋出到 https://dart-packages.example.com,你的 pubspec.yaml 應至少如下所示:

yaml
name: example_package
version: 1.0.0
# Ensures the package is published to https://dart-packages.example.com
publish_to: https://dart-packages.example.com

然後,要釋出包的新版本,請使用 dart pub publish

dart pub publish
Publishing example_package 1.0.0 to https://dart-packages.example.com
|-- CHANGELOG.md
|-- LICENSE
|-- README.md
|-- lib
|   '-- example_package.dart
'-- pubspec.yaml
...

覆蓋預設包倉庫

#

預設情況下,除非使用託管依賴項語法指定自定義包倉庫,否則 dart pub 會從 pub.dev 站點檢索依賴項併發布包。但是,你可以使用 PUB_HOSTED_URL 環境變數覆蓋預設包倉庫。

這種方法在將所有包映象到私有包倉庫或在受限網路環境中工作時映象 pub.dev 的子集時特別有用。

設定自定義包倉庫

#

你可以透過實現託管 Pub 倉庫規範版本 2中概述的 REST API 來編寫自定義包倉庫。

Dart 包倉庫即服務

#

自定義包倉庫也作為一種服務提供,並支援多個供應商的令牌身份驗證,從而減輕了你託管和維護自己的自定義包倉庫的開銷: