目錄

自訂套件儲存庫

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_package 是從 https://dart-packages.example.com 擷取的。如果此套件儲存庫需要驗證,請參閱使用自訂套件儲存庫進行驗證,以取得關於如何驗證要求的詳細資訊。

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

$ 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
...

覆寫預設套件儲存庫

#

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

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

設定自訂套件儲存庫

#

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

作為服務的 Dart 套件儲存庫

#

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