カスタムパッケージリポジトリ
dart pubツールは、サードパーティのパッケージリポジトリをサポートしています。パッケージリポジトリとは、dart pubツールが利用するためのDartパッケージをホストするサーバーです。デフォルトで使用されるパッケージリポジトリであるpub.devは、Dartチームによって運営されており、Dartパッケージの公開を促進するために使用されます。パッケージリポジトリは、https://dart-packages.example.com/のようなhosted-urlによって識別されます。
カスタムパッケージリポジトリは、プライベートパッケージのホスティングに役立つ場合があります。たとえば、以下のようなシナリオがあります。
- 組織内での内部専有パッケージの共有。
- エンタープライズ環境における依存関係の厳密な管理。
- パブリックインターネットアクセスがないセキュアな環境。
プライベートパッケージのホスティングには、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.--env-varフラグを使用して、CI環境などでも、トークンを環境変数から読み取るようにdart pubに指示することもできます。
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を、hosted packagesの構文を使用して指定する必要があります。例:
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を各依存関係に対して指定できるため、異なるパッケージリポジトリから異なる依存関係を取得することもできます。
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.comからmetaを要求する場合などです。したがって、プライベートパッケージリポジトリにパッケージをミラーリングする場合は、すべての依存関係をミラーリングし、各パッケージのdependenciesセクションを更新するか、デフォルトのパッケージリポジトリを上書きする必要があることがよくあります。
カスタムパッケージリポジトリへの発行
#pub.devではなくカスタムパッケージリポジトリにパッケージを発行するには、pubspec.yamlでpublish_toプロパティを指定します。認証が有効になっている場合、発行はパッケージの取得と同じトークン認証を使用します。
https://dart-packages.example.comに発行するパッケージを準備するには、pubspec.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は、hosted-dependency構文を使用してカスタムパッケージリポジトリを指定しない限り、pub.devサイトから依存関係を取得し、パッケージを発行します。しかし、PUB_HOSTED_URL環境変数を使用して、デフォルトのパッケージリポジトリを上書きできます。
このアプローチは、プライベートパッケージリポジトリにすべてのパッケージをミラーリングする場合や、制限されたネットワーク環境で作業している場合にpub.devのサブセットをミラーリングする場合に特に役立ちます。
カスタムパッケージリポジトリの設定
#カスタムパッケージリポジトリは、Hosted Pub Repository Specification Version 2で概説されているREST APIを実装することで作成できます。
サービスとしてのDartパッケージリポジトリ
#カスタムパッケージリポジトリは、複数のベンダーによるトークン認証のサポート付きでサービスとしても提供されており、独自のカスタムパッケージリポジトリのホスティングとメンテナンスのオーバーヘッドを軽減します。