FlutterモノレポをMelosで効率的に管理する方法

はじめに

複数のFlutterアプリケーションやパッケージを開発している場合、それぞれを個別のリポジトリで管理するのは非効率的です。そこで役立つのが「モノレポ(モノリシックリポジトリ)」という開発アプローチです。今回はFlutterプロジェクトのモノレポ管理に特化したツール「Melos」について詳しく解説します。

モノレポとは

モノレポとは、複数のプロジェクトやパッケージを単一のリポジトリで管理する開発アプローチです。Flutterの文脈では、これは複数のFlutterアプリケーションやパッケージを1つのリポジトリで管理することを意味します。

モノレポの主な利点

  • コード共有の容易さ - 共通のウィジェットやロジックを複数のアプリで再利用できる
  • 依存関係の一元管理 - すべてのプロジェクトで一貫したバージョン管理が可能
  • 変更の伝搬 - 共有コードの変更が全プロジェクトに即座に反映される
  • 効率的なCI/CD - テストやデプロイを一元化できる

Melosとは

Melosは、複数のFlutter/Dartパッケージを含むモノレポを効率的に管理するためのコマンドラインツールです。Flutter開発者コミュニティのVery Good Venturesによって開発・保守されており、大規模なFlutterプロジェクトの管理に特に役立ちます。

Melosのインストール

1
dart pub global activate melos

Melosの主な機能

  1. パッケージ管理

    • 依存関係の一括更新
    • 全パッケージでのコマンド実行
    • パッケージ間の依存関係の自動解決
  2. バージョン管理

    • セマンティックバージョニングのサポート
    • パッケージのバージョン一括更新
    • CHANGELOGの自動生成
  3. スクリプト実行

    • 複数パッケージでの並列コマンド実行
    • フィルタリングによる特定パッケージのみの実行
  4. パブリッシング

    • pub.devへの一括公開サポート
    • 依存関係に基づいた適切な公開順序の決定

Melosの設定方法

リポジトリのルートにmelos.yamlを配置して設定します。基本的な構成例は以下の通りです:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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モノレポの基本的な構造は以下のようになります:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
my_monorepo/
  ├── apps/         # 各Flutterアプリケーション
     ├── app1/
     └── app2/
  ├── packages/     # 共有パッケージ
     ├── core/
     ├── ui_kit/
     └── api/
  ├── tools/        # ツールスクリプト
  └── melos.yaml    # Melosの設定ファイル

Melosの実践的な使い方

初期化

リポジトリのクローン後、最初に実行すべきコマンドです:

1
melos bootstrap

これにより、すべてのパッケージの依存関係がインストールされ、ローカルパッケージへのリンクが作成されます。

アプリの起動

モノレポ環境でアプリを起動するには、主に以下の方法があります:

1. 直接ディレクトリに移動して起動

1
2
cd apps/my_app
flutter run

2. Melosを使った起動

1
melos exec --scope="app_name" -- flutter run

3. melos.yamlでスクリプト定義

1
2
3
4
scripts:
  run:app1:
    description: 'アプリ1を実行'
    run: cd apps/app1 && flutter run

そして以下のように実行します:

1
melos run run:app1

引数の渡し方

Melosスクリプト実行時に引数を渡す方法もあります:

1
2
3
4
scripts:
  run:app1:
    description: 'アプリ1を実行 (使用例: melos run run:app1 -- -d chrome)'
    run: cd apps/app1 && flutter run $@

実行時:

1
melos run run:app1 -- -d chrome

もしくは環境変数を使う方法:

1
2
3
4
scripts:
  run:app1:
    description: 'アプリ1を実行 (使用例: DEVICE=chrome melos run run:app1)'
    run: cd apps/app1 && flutter run -d $DEVICE

実行時:

1
DEVICE=chrome melos run run:app1

特定のデバイスでの実行

特定のデバイスでアプリを実行するスクリプトを定義することも可能です:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
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

カスタムスクリプトを使った高度な引数処理

より柔軟な引数処理のためには、シェルスクリプトを作成する方法も効果的です:

1
2
3
4
5
6
#!/bin/bash
# scripts/run_app.sh
APP_NAME=$1
DEVICE=$2
cd apps/$APP_NAME
flutter run -d $DEVICE

Melosから以下のように呼び出します:

1
2
3
4
scripts:
  run:
    description: 'アプリを実行 (使用例: melos run run -- app1 chrome)'
    run: ./scripts/run_app.sh $@

実行時:

1
melos run run -- app1 chrome

まとめ

Melosを活用したFlutterモノレポ管理は、複数アプリの開発効率を大幅に向上させます。特に共通コンポーネントの共有や、バージョン管理、一括コマンド実行などの面で大きな恩恵があります。

大規模なFlutterプロジェクトや、複数のアプリ間で一貫したユーザー体験を提供したい場合には、ぜひモノレポアプローチとMelosの導入を検討してみてください。効率的な開発環境構築の一助となれば幸いです。

comments powered by Disqus