🏃

Dart / Flutter プロジェクトの依存管理を Pub workspaces × Melos 7 系へ移行する

2025/01/16に公開

はじめに

こんにちは、たっつー@tatsutakein です。

Dart / Flutter プロジェクトでモノレポ構築にする場合、これまでは Melos を使用してパッケージの依存を管理することが一般的でした。
しかし、Dart 3.6 から Pub workspaces が正式にサポートされ、より軽量な依存管理が可能になっています。

この記事では、Melos から Pub workspaces への依存管理部分の移行手順を紹介します。

移行の背景

Melos は優れたモノレポ管理ツールですが、Pub workspaces の導入により、より軽量な依存管理が可能になりました。
また、2025/01/16 現在開発段階の Melos 7 系 が Pub workspaces との親和性を高めており、移行のタイミングとして適していると判断しました。

移行手順

1. pubspec_overrides.yaml の削除

まず、Melos 6 系までで生成される pubspec_overrides.yaml を削除します。

find . -name "pubspec_overrides.yaml" -type f -delete

.gitignore からも pubspec_overrides.yaml の記述を削除します。
また、 melos bs 実行時に、実態として flutter pub get が実行されてファイルが生成されるため .flutter-plugins, .flutter-plugins-dependencies を追加します。

.gitignore
 /.dart_tool/*
+/.flutter-plugins
+/.flutter-plugins-dependencies
 
-/pubspec_overrides.yaml

2. Pub workspaces への移行

ルートの pubspec.yamlworkspace を追加します。

pubspec.yaml
 name: template_workspace
 environment:
   sdk: ^3.6.0
 
+workspace:
+  - apps/app
+  - apps/catalog
+  - packages/cores/data
+  - packages/cores/designsystem
+  - packages/cores/model
+  - packages/cores/ui
+  - packages/features/setting

各パッケージの pubspec.yaml には以下のように resolution: workspace を追加します。

apps/app/pubspec.yaml
 name: flutter_app
 description: "A new Flutter project."
 publish_to: 'none'
 version: 0.0.1
 
 environment:
   sdk: ^3.6.0
   flutter: ^3.27.1
 
+resolution: workspace

3. Melos 7 系のインストール

次に、Melos 7 系をインストールします。
2025/01/16 現在ではまだ開発段階のため、以下のようにバージョンを指定してインストールする必要があります。

dart pub global activate Melos 7.0.0-dev.3

4. melos.yaml の移行

melos.yaml の内容をルートの pubspec.yaml に移動します。以下のように移行できます。
なお、 melos.yaml は不要になるため削除します。

pubspec.yaml
 name: template_workspace
 environment:
   sdk: ^3.6.0
 
 workspace:
   - apps/app
   - apps/catalog
 
 # 省略  
 ...
 
+melos:
+  # 以降の内容を melos.yaml から移動
+  sdkPath: .fvm/flutter_sdk
+
+  ide:
+    intellij:
+      enabled: false
+  # 省略
+  ...

ただし、以下の項目は移行不要です。

  • name
  • packages

公式のマイグレーションガイド でも不要だと記載されています。

Except for the packages and name

5. 依存関係の再構築

最後に、以下のコマンドで依存関係を再構築します。

melos bs

注意点

移行時に以下の点に注意が必要です。

  1. パッケージバージョンの互換性確認
    • 例:theme_extensions_builder を 4.0.0 から 3.1.0 にダウングレードする必要がある場合があります
    • 理由:間接的に依存している source_gen のメジャーバージョンの違いによる問題を避けるため
  2. ビルド検証
    • キャレット(^) などでバージョンを指定している場合、依存ライブラリのバージョンが変わる可能性があります。
      ビルドエラーが発生する可能性があるため、ビルド検証を行うことをおすすめします。

参考例

ゆめみで開発を進めている Flutter のモバイルアプリテンプレートプロジェクトでも既に対応を進めています。
以下の Pull Request をぜひ参考にしていただけると幸いです。

https://github.com/yumemi-inc/flutter-mobile-project-template/pull/371

まとめ

Pub workspaces へ移行することで、より軽量で管理しやすい依存管理が実現できます。
また、Melos 7 系との組み合わせにより既存の機能を損なうことなく移行が可能です。

参考

GitHubで編集を提案
株式会社ゆめみ

Discussion