はじめに

Flutter で開発していると必ず利用する pub.dev は本当に色々な パッケージ(ライブラリ) があって便利ですよね。今までパッケージを作ったことなかったので、今回は pub.dev に自作のパッケージを公開する流れを書いていこうと思います。

開発環境

  • Android Studio Arctic Fox 2020.3.1 Patch 1
  • Flutter Plugin 59.0.2

パッケージには2種類ある

作成することができるパッケージには以下の2種類があります。今回はそれぞれ見ていこうと思います。

  • Dart パッケージ
    • 名前の通り Dart で書かれたパッケージ。Flutterのフレームワークのみを使う。
  • Plugin パッケージ
    • ネイティブAPIを使ったパッケージ。
    • Android(Kotlin・Java)や、iOS(Swift・Objective-C)、Web、macOS、Windows、Linux、それらの組み合わせに対して記述することができます。

公式サイト:Developing packages & plugins

1. テンプレート作成

Dart パッケージ の場合

以下のコマンドでプラグインのテンプレートを作成します。XXXXX部分は任意のパッケージ名をつけてください。

$ flutter create --template=package XXXXX

またはAndroid Studioから作成できます。

Dart パッケージの場合は「Flutter Package」を、Plugin パッケージの場合は「Flutter plugin」を選択します。

ちなみに項目の Flutter Module は、Flutter で作った機能を既存の Android・iOS に組み込みたい時に利用します。

Flutter Package(Dart パッケージ)を選択すると、このような画面になります。名前、説明文を入力します。

作成されたフォルダ内は以下のような階層になっています。

Plugin パッケージ の場合

以下のコマンドでプラグインのテンプレートを生成します。言語指定の kotlin,swift の部分は java,objc にも変更可能です。XXXXX部分は任意のパッケージ名をつけてください。

$ flutter create --template=plugin --platforms=android,ios XXXXX

オプションで以下の指定ができます。
–platforms
プラットフォームの指定。指定がない場合どのプラットフォームもサポートしません。後から追加も可能

-a,-i
プロジェクトのネイティブコードの指定。-aはAndroid、-iはiOSです。デフォルトは Kotlin・Swift なので、 Java・Objective-C を使用したい場合に指定すれば良いです。

-a java -i objc

–org
organization。逆ドメイン名表記で指定します。

--org com.example

こちらもAndroid Studioからでも作成できます。

作成されたフォルダ内は以下のような階層になっています。

  • android, ios フォルダ
    • ネイティブAPIを使うコードをここに書いていきます。
  • lib フォルダ
    • ネイティブAPIのブリッジプラグインを実行する Dart コードを書いていきます。
  • example フォルダ
    • 通常のFlutterプロジェクトが用意されているので、ここで動作確認しながらパッケージを実装できます。
    • またパッケージ公開後、使用する人も見ることができるので、どのように実装するか良い例になると思います。

2. 実装

Dart パッケージ の場合

通常のFlutterのプロジェクトの実装と同じく、libフォルダ内にdartファイルを追加・編集していきます。

動作の確認ですが、Flutterプロジェクトを作って確認していきます。作成しているパッケージ内の一番上のフォルダで、以下のコマンドを打ちます(名前は慣例で example としています)

flutter create example

作成された example フォルダ内の pubspec.yaml に作成しているパッケージを追加します。

dependencies:

  flutter:
    sdk: flutter

  # 作成しているパッケージを追加(パスで指定します)
  dart_package:
    path: ../

あとは example/lib/main.dart にパッケージを使用するように記述します。

Plugin パッケージ の場合

動作確認は Dart パッケージと同じで example フォルダで確認していきます。Plugin パッケージの場合は予め example が用意されているので、自分で作る必要はありませんでした。

3. ドキュメントの対応

License

パッケージのライセンスを記述します。Dartでも使用されている BSD 3-clauseライセンス が推奨されているようですが、最適なものを選択するようにしてください。

テンプレートは、OSS(Open Source Software) を促進する組織 OSI(Open Source Initiative) に公開されているので、こちらを使用するのが良いと思います。

“Copyright <YEAR> <COPYRIGHT HOLDER>” 部分を書き換えて使用してください。

Copyright <YEAR> <COPYRIGHT HOLDER>

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.

2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.

3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

CHANGELOG.md

パッケージの更新履歴をMD形式で記述します。pub.dev の Changelog タブに表示されます。

README.md

パッケージの説明や使い方をMD形式で記述します。公開されたパッケージの Readme タブ(トップページ)に表示されます。スクリーンショットやコード例なども記載して、親切な Readme を心がけましょう。

そのためのヒントも公式で用意されていました。さすがドキュメントが充実している Flutter ですね☺️
公式ドキュメント:Writing package pages

pubspec.yaml

パッケージについての情報を記述します。

  • name
    • パッケージ名。すべて小文字のスネークケースで記述。
  • version
    • バージョン。
    • オプションでビルド(+1, +2, +hotfix.oopsie)やプレリリース(-dev.4, -alpha.12, -beta.7, -rc.5)という接尾辞をつけることも可能。
  • description
    • パッケージについての説明。60~180文字程度の短い文章が良いようです。
    • プレーンテキストで記述。MD形式やHTMLは使用不可。
  • homepage
    • パッケージのサイトURL。通常はGitHubリポジトリのURLを指定することが多いようです。

公式ドキュメント:The pubspec file

4. 検証済みパブリッシャーの登録

パッケージを公開する時、検証済みパブリッシャー(verified publisher)での公開を推奨しているようです。検証済みパブリッシャーとは、身元が確認されたパブリッシャーによって、そのパッケージが公開されたことを示すものです。

メリットとしては、以下の内容があります。

  • 認証バッジが表示され、パッケージを利用するユーザに周知できる
  • 個人のメールアドレスを公開しないですむ

手順は公式サイト「create-verified-publisher」を参照ください。独自ドメインが必要ですが、手順はそこまで難しくないです。自分は持っていなかったため今回は見送りました。

公式ドキュメント:verified publishers

5. 公開手順

以下のコマンドで公開前に問題がないかを確認します。

dart pub publish --dry-run

特にエラーメッセージが表示されなければ、公開します。

dart pub publish

注意点

  • 一度公開したパッケージは基本的に二度と削除できません
    • 誤って公開してしまった場合、公開中止の申請をすることが可能です(ただし48時間以内)
    • pub.dev policy に詳しい記載があります
  • 公開できるパッケージサイズは最大100MBまで

Your package must be smaller than 100 MB after gzip compression. If it’s too large, consider splitting it into multiple packages, using a .pubignore file to remove unnecessary content, or cutting down on the number of included resources or examples.
パッケージは、gzip圧縮後に100MB以下である必要があります。サイズが大きすぎる場合は、複数のパッケージに分割したり、.pubignoreファイルを使って不要なコンテンツを削除したり、同梱するリソースやサンプルの数を減らしたりすることを検討してください。

公式サイト:Publishing packages

その他

公開されている Dart・Plugin パッケージは pub.dev から調べることができます。GitHubでコードも見られるので色々参考になると思います。

参考URL

公式サイト:Flutter プラグインの作成方法

Flutter公式のプラグイン GitHub

まとめ

Flutter でのパッケージ作成の方法を見てきましたが、いかがだったでしょうか?公開まで比較的スムーズに作業できることができました。

ちなみに公開されている全パッケージ数は、執筆時点で21,694個もあるようです。Flutter は色々なパッケージがあって本当に助かっています。今後は自分もパッケージを公開して、Flutter の発展に少しでも貢献できればと思います。



ギャップロを運営しているアップフロンティア株式会社では、一緒に働いてくれる仲間を随時、募集しています。 興味がある!一緒に働いてみたい!という方は下記よりご応募お待ちしております。
採用情報をみる