Dart / Flutter プロジェクトの依存管理を Pub workspaces × Melos 7 系へ移行する
はじめに
こんにちは、たっつー@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
を追加します。
/.dart_tool/*
+/.flutter-plugins
+/.flutter-plugins-dependencies
-/pubspec_overrides.yaml
2. Pub workspaces への移行
ルートの pubspec.yaml
に workspace
を追加します。
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
を追加します。
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
は不要になるため削除します。
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
公式のマイグレーションガイド でも不要だと記載されています。
5. 依存関係の再構築
最後に、以下のコマンドで依存関係を再構築します。
melos bs
注意点
移行時に以下の点に注意が必要です。
- パッケージバージョンの互換性確認
- 例:theme_extensions_builder を 4.0.0 から 3.1.0 にダウングレードする必要がある場合があります
- 理由:間接的に依存している source_gen のメジャーバージョンの違いによる問題を避けるため
- ビルド検証
- キャレット(^) などでバージョンを指定している場合、依存ライブラリのバージョンが変わる可能性があります。
ビルドエラーが発生する可能性があるため、ビルド検証を行うことをおすすめします。
- キャレット(^) などでバージョンを指定している場合、依存ライブラリのバージョンが変わる可能性があります。
参考例
ゆめみで開発を進めている Flutter のモバイルアプリテンプレートプロジェクトでも既に対応を進めています。
以下の Pull Request をぜひ参考にしていただけると幸いです。
まとめ
Pub workspaces へ移行することで、より軽量で管理しやすい依存管理が実現できます。
また、Melos 7 系との組み合わせにより既存の機能を損なうことなく移行が可能です。
Discussion