melos 7.x.xへのマイグレーション - melos.yamlからWorkspacesへの移行

どうも、Shinyaです。この記事では、melos 7.0.0で導入された破壊的変更に対応し、従来のmelos.yamlからDart 3.6 Workspacesベースの構成へ移行する手順について解説します。
- melosを使用しているDart/Flutterのモノレポプロジェクトを管理している人
- melos 7.x.xへのアップグレードを検討している人
- Dart 3.6 Workspacesについて知りたい人
- melos.yamlからの移行手順を確認したい人
melos 7.0.0の変更点
melos 7.0.0では、従来のmelos.yamlによる設定が非推奨となり、Dart 3.6で導入されたWorkspaces機能を使用する構成に変更されました。
これまでmelosではmelos.yamlにパッケージの一覧やスクリプトを定義していましたが、7.0.0以降はルートのpubspec.yamlにワークスペースの定義を記述する形式に移行する必要があります。
公式のマイグレーションガイドはmelosのGitHubリポジトリで公開されています。
マイグレーション手順
1. melosのバージョンを更新する
ルートのpubspec.yamlにあるmelosのバージョンを^7.1.0以上に更新します。
dev_dependencies:
melos: ^7.1.0
更新後、依存パッケージを取得します。
dart pub get
2. ルートのpubspec.yamlにworkspaceを追加する
ルートのpubspec.yamlにworkspaceセクションを追加し、モノレポに含まれるパッケージのパスを列挙します。
name: my_workspace
environment:
sdk: ^3.6.0
workspace:
- packages/core
- packages/auth
- packages/api
dev_dependencies:
melos: ^7.1.0
従来のmelos.yamlではpackages:セクションにglobパターンでパッケージのパスを指定していましたが、Dart Workspacesでは各パッケージのパスを個別に列挙する必要があります。
3. 各パッケージにresolution: workspaceを追加する
ワークスペースに含まれる各パッケージのpubspec.yamlにresolution: workspaceを追加します。
name: core
version: 1.0.0
environment:
sdk: ^3.6.0
resolution: workspace
この設定により、各パッケージの依存関係がワークスペースレベルで解決されます。
4. melos listで確認する
設定が正しく行われているかを確認するために、melos listを実行します。
melos list
ワークスペースに含まれるパッケージの一覧が表示されれば、移行は成功しています。
core
auth
api
5. カスタムスクリプトを移行する
従来のmelos.yamlに定義していたカスタムスクリプトは、ルートのpubspec.yamlのmelos:セクションに移行します。
移行前(melos.yaml):
name: my_workspace
packages:
- packages/*
scripts:
hello:
run: echo 'Hello World'
analyze:
run: dart analyze .
exec:
concurrency: 1
移行後(pubspec.yaml):
name: my_workspace
environment:
sdk: ^3.6.0
workspace:
- packages/core
- packages/auth
- packages/api
dev_dependencies:
melos: ^7.1.0
melos:
scripts:
hello:
run: echo 'Hello World'
analyze:
run: dart analyze .
exec:
concurrency: 1
移行後、melos.yamlは不要になるため削除できます。
スクリプトの実行確認
melos run hello
Hello World
トラブルシューティング
「Cannot override workspace packages」エラー
マイグレーション後に以下のようなエラーが発生する場合があります。
Cannot override workspace packages.
このエラーは、pubspec_overrides.yamlの内容がワークスペースの設定と競合している場合に発生します。pubspec_overrides.yamlはmelosの旧バージョンで自動生成されたファイルであり、Dart Workspacesへの移行後は不要です。
以下のコマンドでpubspec_overrides.yamlを削除し、再度依存関係を解決します。
# プロジェクト内のpubspec_overrides.yamlを検索して削除
find . -name "pubspec_overrides.yaml" -delete
# 依存関係を再取得
dart pub get
まとめ
この記事では、melos 7.0.0で導入された破壊的変更に対応し、melos.yamlからDart 3.6 Workspacesベースの構成へ移行する手順について解説しました。
マイグレーションの主な作業は、ルートのpubspec.yamlへのworkspaceセクションの追加、各パッケージへのresolution: workspaceの追加、カスタムスクリプトのmelos:セクションへの移行です。pubspec_overrides.yamlの競合によるエラーが発生した場合は、該当ファイルの削除で解消できます。
参考リンク:


