メインコンテンツまでスキップ

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

· 約5分
Shinya Kato
DayoneLabs管理人、ソフトウェア開発者、OSS開発者

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以上に更新します。

pubspec.yaml(ルート)
dev_dependencies:
melos: ^7.1.0

更新後、依存パッケージを取得します。

ターミナル
dart pub get

2. ルートのpubspec.yamlにworkspaceを追加する

ルートのpubspec.yamlworkspaceセクションを追加し、モノレポに含まれるパッケージのパスを列挙します。

pubspec.yaml(ルート)
name: my_workspace

environment:
sdk: ^3.6.0

workspace:
- packages/core
- packages/auth
- packages/api

dev_dependencies:
melos: ^7.1.0
従来のmelos.yamlとの対応

従来のmelos.yamlではpackages:セクションにglobパターンでパッケージのパスを指定していましたが、Dart Workspacesでは各パッケージのパスを個別に列挙する必要があります。

3. 各パッケージにresolution: workspaceを追加する

ワークスペースに含まれる各パッケージのpubspec.yamlresolution: workspaceを追加します。

packages/core/pubspec.yaml
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.yamlmelos:セクションに移行します。

移行前(melos.yaml):

melos.yaml
name: my_workspace

packages:
- packages/*

scripts:
hello:
run: echo 'Hello World'
analyze:
run: dart analyze .
exec:
concurrency: 1

移行後(pubspec.yaml):

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の競合によるエラーが発生した場合は、該当ファイルの削除で解消できます。


参考リンク:

免責事項:
当記事は管理人の開発時に書き留められたメモをもとにAIを活用して編纂されたものです。 管理人は記事の公開前に内容の校正・校閲を行い、記事の信頼性と正確性の向上に務めますが、それらを保証するものではありません。 また、当記事の編集時の誤字やコード例の不具合等によって読者が何らかの損害等を被った場合でも、管理人は一切の責任を負いません。 当記事に掲載したコンテンツの利用については自己責任でお願い致します。