目次

カスタムパッケージリポジトリ

dart pubツールは、サードパーティ製パッケージリポジトリをサポートしています。パッケージリポジトリとは、dart pubツールが使用するためにDartパッケージをホストするサーバーです。デフォルトで使用されるパッケージリポジトリであるpub.devは、Dartチームが運営しており、Dartパッケージを公開して誰でも利用できるようにすることを目的としています。パッケージリポジトリは、https://dart-packages.example.com/のような*ホストURL*で識別されます。

カスタムパッケージリポジトリは、プライベートパッケージをホストするのに役立つ場合があります。たとえば、次のようなシナリオが考えられます。

  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.

CI環境など、--env-varフラグを使用して、環境変数からトークンを読み取るように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にパッケージの*ホストURL*を指定する必要があります。例えば

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

前の例では、package:example_packagehttps://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_packagehttps://dart-packages.example.comからのmetaを必要とする場合です。そのため、パッケージをプライベートパッケージリポジトリにミラーリングする場合、すべての依存関係をミラーリングし、各パッケージのdependenciesセクションを更新するか、デフォルトパッケージリポジトリをオーバーライドする必要があることがよくあります。

カスタムパッケージリポジトリへの公開

#

pub.devではなくカスタムパッケージリポジトリにパッケージを公開するには、pubspec.yamlpublish_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パッケージリポジトリ

#

カスタムパッケージリポジトリは、複数のベンダーによってトークン認証がサポートされるサービスとしても提供されており、独自のカスタムパッケージリポジトリをホストおよび保守するオーバーヘッドを軽減できます。