🎯

Flutter/Dartで自作パッケージをpub.devへ公開する手順

2021/01/20に公開

はじめに

Flutter/Dartで開発していると、他の誰かが使えそうな汎用的なWidgetを作ることがあります。
こうした汎用的なWidgetは、pub.devへパッケージとして公開しておくと、pubspec.yamlへ指定することで他の人が使うことができます。

この記事では、pub.devへ自作パッケージを公開するまでの手順を紹介します。

パッケージを公開する準備をする

パッケージ用プロジェクトを作る

パッケージを公開する際は、次のコマンドでパッケージ用プロジェクトを作成します。

$ flutter create --template=package your_app_project

このプロジェクトは、次のような構成となっています。

|-- .gitignore
|-- CHANGELOG.md
|-- LICENSE
|-- README.md
|-- lib
|   '-- your_app_project.dart
|-- pubspec.yaml
'-- test
    '-- your_app_project_test.dart

lib直下のyour_app_project.dartは、次の一文から始まっています。
library your_app_project;
これは、そのファイルがライブラリのルートファイルであるということを示しています。
(2021/01/21追記)
上記に関して Kaboさんから指摘をいただきました。

https://twitter.com/kabochapo/status/1352159736079155200

library directive が宣言されていない場合、ライブラリのパスとファイル名に基づいて一意なタグが生成されるようです。
なので、 ライブラリレベルでのドキュメント を生成する予定がなければ、寧ろ libraryを省略することが推奨されているようです。(Kaboさんありがとうございました🙏)
Creating packages | Dart
(追記終わり)

また、lib/src下のファイルに書いたコードはプライベートとなるため、ライブラリのAPIとして公開するコードは、lib直下へ書いておく必要があります。

パッケージ公開での制限事項・メタ情報の公開方法

パッケージを公開するにあたっては、次の制限に従う必要があります。

  • LICENSEファイルを含むこと(Dart自体が使っている、BSD-3-Clauseが推奨されている)
  • gzip圧縮後のサイズが10MB以下であること(大きすぎる場合は、複数のパッケージに分割する等する)
  • パッケージは他の pub.devに存在するパッケージ、またはFlutter等のSDKにのみ依存していること
  • Googleアカウントを持っていること(アップロード権限管理に使用)

また、次のファイルにパッケージ公開に関するメタ情報等を含めることができます。

  • README.md
    • README.mdに書いた内容は、パッケージのページで公開されるメインコンテンツとなる。
  • CHANGELOG.md
    • CHANGELOG.mdに書いた更新履歴は、パッケージページのタブに表示される。
  • pubspec.yaml
    • pubspec.yamlには、パッケージの説明やホームページなど、パッケージページの右側にある、詳細情報を記入するために使用されます

検証済みパブリッシャーとして登録する

公式には、個人のGoogleアカウントより、検証済みパブリッシャーとしてパッケージを公開することが推奨されています。
検証済みパブリッシャーとして登録すると、個人のメールアドレス(Gmail)を公開せず、また次のような検証済みバッジが付きます。

検証済みパブリッシャーとして登録するには、次の手順を行います。

  1. Dart packages へアクセス
  2. Googleアカウントでログインする
  3. 右上メニューから「Create publisher」を選択
  4. パブリッシャーに関連付けるドメイン ( dart.dev 等)を入力し、「Create Publisher」をクリックする。

Google Domainsでドメインを取得していれば、そのまま自動でパブリッシャーとして登録されます。
他でドメインを取得している場合は、この後 Google Search Console でドメインの所有権を証明する必要があることがあります。

パッケージを公開する

では、いよいよパッケージを公開していきます。

注意点として、基本的に一度公開したパッケージは二度と削除することができません
この辺りのポリシー(削除可能な例外も)については、Policy | Pub siteへ書かれています。

なお、次のファイルはパッケージ公開に際してアップロードされることはありません。

  • packagesディレクトリ
  • lockfile ( pubspec.lock)
  • Gitを使っていない場合
    • 全ての隠しファイル
  • Gitを使っている場合
    • .gitignoreで除外されているファイル

公開してはいけないファイルを含んでないかなど確認したら、次のコマンドで公開するテストをしてみましょう。
$ dart pub publish --dry-run

出力は次のようになります。

$ dart pub publish --dry-run
Publishing material_spacing_checker 0.1.0 to https://pub.dartlang.org:
|-- .gitignore
|-- CHANGELOG.md
|-- LICENSE
|-- README.md
|-- analysis_options.yaml
|-- lib
|   '-- material_spacing_checker.dart
|-- pubspec.yaml
'-- test
    '-- .gitkeep

Package has 0 warnings.

こちらがパッケージとして公開されるファイル一覧となるので、ダメなものを含んでいないか、再度確認しておきましょう。

確認したら、あとは—dry-runを外して dart pub publishでパッケージを公開します。

なお、パッケージ公開後、最初は個人のGoogleアカウントで公開されていると思いますが、

  1. パッケージのページへアクセス
  2. Adminタブを選択
  3. Select a publisher で検証済みパブリッシャーを選択
  4. 「TRANSFAR TO PUBLISHER」をクリック

とすることで、検証済みパブリッシャーへ所有権を移す(個人でなく、検証済みパブリッシャーとしてパッケージを公開する)ことができます。

参考資料

Developing packages & plugins - Flutter
Publishing packages | Dart
Dart Programming - Libraries - Tutorialspoint
Creating packages | Dart
ドメインホストの特定 - Google Workspace 管理者 ヘルプ

参考にさせていただいたパッケージ

mono0926/adaptive_dialog: Show alert dialog or modal action sheet adaptively according to platform.
hnvn/flutter_shimmer: A package provides an easy way to add shimmer effect in Flutter project
rrousselGit/river_pod: A simple way to access state while robust and testable.
table_calendar | Flutter Package

Discussion