FlutterモノレポをMelosで効率的に管理する方法
はじめに
複数のFlutterアプリケーションやパッケージを開発している場合、それぞれを個別のリポジトリで管理するのは非効率的です。そこで役立つのが「モノレポ(モノリシックリポジトリ)」という開発アプローチです。今回はFlutterプロジェクトのモノレポ管理に特化したツール「Melos」について詳しく解説します。
モノレポとは
モノレポとは、複数のプロジェクトやパッケージを単一のリポジトリで管理する開発アプローチです。Flutterの文脈では、これは複数のFlutterアプリケーションやパッケージを1つのリポジトリで管理することを意味します。
モノレポの主な利点
- コード共有の容易さ - 共通のウィジェットやロジックを複数のアプリで再利用できる
- 依存関係の一元管理 - すべてのプロジェクトで一貫したバージョン管理が可能
- 変更の伝搬 - 共有コードの変更が全プロジェクトに即座に反映される
- 効率的なCI/CD - テストやデプロイを一元化できる
Melosとは
Melosは、複数のFlutter/Dartパッケージを含むモノレポを効率的に管理するためのコマンドラインツールです。Flutter開発者コミュニティのVery Good Venturesによって開発・保守されており、大規模なFlutterプロジェクトの管理に特に役立ちます。
Melosのインストール
dart pub global activate melos
Melosの主な機能
-
パッケージ管理
- 依存関係の一括更新
- 全パッケージでのコマンド実行
- パッケージ間の依存関係の自動解決
-
バージョン管理
- セマンティックバージョニングのサポート
- パッケージのバージョン一括更新
- CHANGELOGの自動生成
-
スクリプト実行
- 複数パッケージでの並列コマンド実行
- フィルタリングによる特定パッケージのみの実行
-
パブリッシング
- pub.devへの一括公開サポート
- 依存関係に基づいた適切な公開順序の決定
Melosの設定方法
リポジトリのルートにmelos.yamlを配置して設定します。基本的な構成例は以下の通りです:
name: my_flutter_monorepo
packages:
- apps/**
- packages/**
scripts:
analyze:
description: 'すべてのパッケージでの静的解析実行'
run: dart analyze .
exec:
concurrency: 5
test:
description: 'すべてのパッケージでのテスト実行'
run: flutter test
exec:
concurrency: 5
build:all:
description: 'すべてのアプリをビルド'
run: melos run build --no-select
dependsOn: [analyze, test]
version:
description: 'バージョンを上げる'
run: melos version
モノレポの一般的な構造
Flutterモノレポの基本的な構造は以下のようになります:
my_monorepo/
├── apps/ # 各Flutterアプリケーション
│ ├── app1/
│ └── app2/
├── packages/ # 共有パッケージ
│ ├── core/
│ ├── ui_kit/
│ └── api/
├── tools/ # ツールスクリプト
└── melos.yaml # Melosの設定ファイル
Melosの実践的な使い方
初期化
リポジトリのクローン後、最初に実行すべきコマンドです:
melos bootstrap
これにより、すべてのパッケージの依存関係がインストールされ、ローカルパッケージへのリンクが作成されます。
アプリの起動
モノレポ環境でアプリを起動するには、主に以下の方法があります:
1. 直接ディレクトリに移動して起動
cd apps/my_app
flutter run
2. Melosを使った起動
melos exec --scope="app_name" -- flutter run
3. melos.yamlでスクリプト定義
scripts:
run:app1:
description: 'アプリ1を実行'
run: cd apps/app1 && flutter run
そして以下のように実行します:
melos run run:app1
引数の渡し方
Melosスクリプト実行時に引数を渡す方法もあります:
scripts:
run:app1:
description: 'アプリ1を実行 (使用例: melos run run:app1 -- -d chrome)'
run: cd apps/app1 && flutter run $@
実行時:
melos run run:app1 -- -d chrome
もしくは環境変数を使う方法:
scripts:
run:app1:
description: 'アプリ1を実行 (使用例: DEVICE=chrome melos run run:app1)'
run: cd apps/app1 && flutter run -d $DEVICE
実行時:
DEVICE=chrome melos run run:app1
特定のデバイスでの実行
特定のデバイスでアプリを実行するスクリプトを定義することも可能です:
scripts:
# iOSで実行
run:app1:ios:
description: 'アプリ1をiOSで実行'
run: cd apps/app1 && flutter run -d 'iPhone 13'
# Androidで実行
run:app1:android:
description: 'アプリ1をAndroidで実行'
run: cd apps/app1 && flutter run -d 'Pixel 4a'
# Webで実行
run:app1:web:
description: 'アプリ1をWebで実行'
run: cd apps/app1 && flutter run -d chrome
カスタムスクリプトを使った高度な引数処理
より柔軟な引数処理のためには、シェルスクリプトを作成する方法も効果的です:
#!/bin/bash
# scripts/run_app.sh
APP_NAME=$1
DEVICE=$2
cd apps/$APP_NAME
flutter run -d $DEVICE
Melosから以下のように呼び出します:
scripts:
run:
description: 'アプリを実行 (使用例: melos run run -- app1 chrome)'
run: ./scripts/run_app.sh $@
実行時:
melos run run -- app1 chrome
まとめ
Melosを活用したFlutterモノレポ管理は、複数アプリの開発効率を大幅に向上させます。特に共通コンポーネントの共有や、バージョン管理、一括コマンド実行などの面で大きな恩恵があります。
大規模なFlutterプロジェクトや、複数のアプリ間で一貫したユーザー体験を提供したい場合には、ぜひモノレポアプローチとMelosの導入を検討してみてください。効率的な開発環境構築の一助となれば幸いです。