🍥

【Flutter】pub.dev にない private repository や自作パッケージを利用する

2024/01/30に公開

Flutter Application を開発する際、パッケージを利用するのは一般的かと思います。
目的のパッケージを pub.dev から探し、pubspec.yaml に記述するなり、flutter pub add <package> する方法が一般的でしょう。

google font を導入する場合

flutter pub add google_fonts

もしくは

#-------------略-------------
dependencies:
  google_fonts: ^6.1.0
#-------------略-------------

今回はこういったパッケージマネージャに頼らず、独自に作成したパッケージや hotfix のために緊急で作成されたパッケージを利用するための方法を備忘録として残します。

方法

  1. ローカルのパッケージを参照する方法
  2. Git リポジトリから参照する方法

ローカルのパッケージを参照する方法

例えば、開発したアプリケーションでコードの可読性、メンテナンス性の向上を目的としている場合や開発中のパッケージでサンプルアプリケーションを使用した確認などを行いたい場合、ローカルパッケージを参照する方法が便利です。
Application ディレクトリと Package ディレクトリが以下のように分かれていると想定した場合、pubspec.yaml で、以下のように指定するだけです。

.
├─ package-a # 自作パッケージ
└─ sample_app # 自作パッケージを呼び出したいアプリケーション

package の path を指定するだけです。import などは pub.dev からインストールした場合と同じように使えます。

#-------------略-------------
dependencies:

  package-a:
    path: ../package-a
#-------------略-------------

Git リポジトリから参照する方法

次は Git リポジトリから参照する方法です。
こちらも、用途としては上述した場合と同じように、pub.dev には公開したくない場合などに利用することができますが、他にも、hotfix バージョンのライブラリを利用する際にも活用できる方法です。

使い方は pubspec.yaml で、以下のように指定するだけです。

#-------------略-------------
dependencies:

  package-a:
    git:
      url: https://github.com/<account name>/<repository name>.git
      path: packages/<repository>
      ref: <commit id>
#-------------略-------------

.git url を指定し、path でパッケージの root までを指定します。
root にパッケージがある場合、指定は不要です。
また、ref でコミット ID まで指定することができます。

また、ssh で private リポジトリを参照することもできます。
開発チームのみで利用したい場合は便利かもしれません。

#-------------略-------------
dependencies:
  package-a:
    git:
      url: git@github.com/<account name>/<repository name>.git
      path: packages/<repository>
#-------------略-------------

過去に、connectivity_plus v4 系を利用したアプリ を XCode15 でビルドすると、アプリがクラッシュしてしまうという不具合が発生したことがありました。
この際に、開発チームが急遽修正した hotfix 版を、この方法を利用してとりあえず修正した記憶があります。

https://github.com/fluttercommunity/plus_plugins/issues/2154#issuecomment-1741748709

最後に

最後の SSH でやる方法は知りませんでした。
Application A, Application B で同じ自作パッケージを参照したいとき、同じリポジトリに A も B も自作パッケージもルートに設置した状態で、 1 の方法を使っていたのでこの方法ならリポジトリも各アプリごとに分けられそうです。

参考

https://docs.flutter.dev/packages-and-plugins/using-packages
https://github.com/fluttercommunity/plus_plugins/issues/2154#issuecomment-1741748709

Discussion