跳到主要內容

自訂套件儲存庫

dart pub 工具支援第三方套件儲存庫。套件儲存庫是託管 Dart 套件的伺服器,供 dart pub 工具使用。預設使用的套件儲存庫 pub.dev 由 Dart 團隊營運,以促進 Dart 套件的公開發佈。套件儲存庫由託管 URL 識別,例如 https://dart-packages.example.com/

有時,自訂套件儲存庫可能適用於託管私人套件,包括在以下某些情境中

  1. 在組織內共用內部專有套件。
  2. 嚴格控制企業環境中的相依性。
  3. 沒有公共網際網路連線的安全環境。

使用 git-dependencies 來託管私人套件也很常見,但是,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.

您也可以告知 dart pub 從環境變數讀取權杖,包括在 CI 環境中,使用 --env-var 旗標

$ 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 中指定套件的託管 URL,使用 託管套件 的語法。例如

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

在先前的範例中,package:example_package 是從 https://dart-packages.example.com 擷取的。如果此套件儲存庫需要驗證,請參閱 使用自訂套件儲存庫進行驗證 以取得有關如何驗證請求的更多資訊。

您也可以搭配 --hosted 旗標使用 dart pub add 命令,從自訂套件儲存庫新增相依性

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

使用多個套件儲存庫

#

您也可以從不同的套件儲存庫擷取不同的相依性,因為可以為每個相依性指定託管 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
...

覆寫預設套件儲存庫

#

預設情況下,除非使用 hosted-dependency 語法指定自訂套件儲存庫,否則 dart pub 會從 pub.dev 網站擷取相依性並將套件發佈到該網站。但是,您可以使用 PUB_HOSTED_URL 環境變數覆寫預設套件儲存庫。

當在受限網路環境中工作時,鏡像私人套件儲存庫中的所有套件或 pub.dev 的子集時,此方法特別有用。

設定自訂套件儲存庫

#

您可以透過實作 託管 Pub 儲存庫規格版本 2 中概述的 REST API 來撰寫自訂套件儲存庫。

Dart 套件儲存庫即服務

#

自訂套件儲存庫也以服務形式提供,並由多家供應商支援權杖驗證,從而減輕您託管和維護自己的自訂套件儲存庫的負擔