Dartにおけるモノレポ管理の定番「melos」が7.0.0からmelos.yamlを廃止した

Dart
この記事はこんな人にオススメ
  • Dart言語でモノレポ管理に興味のある人
  • melosでmelos.yamlが廃止されて困っている人
  • melosの7.x.xへのマイグレーションを考えている人

どうも、Shinyaです。

この記事では、Dart言語でモノレポ管理を行う際に非常に便利なツール「melos」が7.0.0からmelos.yamlを廃止したので、その際に必要なマイグレーション作業を備忘録として残しておきます。

melos.yamlにカスタムスクリプトを定義していた方はもちろんのこと、Workspacesの導入が必須となり全てのmelosユーザーがマイグレーションを行う必要があります。

補足しておくと、melosが公式で推奨している7.x.xへのマイグレーション手順は次のリンクから確認できます。

melos 7.x.xへのマイグレーション

melosのバージョンを更新する

まずは、使用しているmelosのバージョンを7.x.xへ更新します。この記事では参考までに、次のようにv7.1.0を使用します。

dev_dependencies:
  melos: ^7.1.0

pubspec.yamlでWorkspacesを設定する

melosは7.0.0からmelos.yamlを廃止する代わりに、Dart 3.6から導入されたWorkspacesを使用するようです。

そのため、まずはルートのpubspec.yamlにモノレポで管理するパッケージを次のようにworkspaceに追加してください。

今回の例では、私が開発しているOSSプロジェクトのatproto.dartを使用します。

name: atproto_dart
publish_to: none
environment:
  sdk: ">=3.8.0 <4.0.0"
workspace:
  - packages/at_identifier
  - packages/at_uri
  - packages/atproto
  - packages/atproto_core
  - packages/atproto_oauth
  - packages/bluesky
  - packages/bluesky_cli
  - packages/bluesky_text
  - packages/did_plc
  - packages/lexicon
  - packages/multiformats
  - packages/nsid
  - packages/xrpc

dev_dependencies:
  melos: ^7.1.0

次に、モノレポで管理する個々のパッケージのpubspec.yamlに次の定義を追加します。

resolution: workspace

例えば、次のように個々のパッケージのpubspec.yamlに追加していきます。

name: bluesky
environment:
  sdk: ">=3.8.0 <4.0.0"
resolution: workspace

melosとWorkspacesの動作確認を行う

ここまで作業が完了したらmelosコマンドがパッケージを認識するようになっているか確認してみましょう。

コマンドラインで次のmelosコマンドを実行してください。

melos list

次のようにworkspaceに追加したパッケージが出力されればmelosの設定は完了です。

% melos list
at_identifier
at_uri
atproto
atproto_core
atproto_oauth
bluesky
bluesky_cli
bluesky_text
did_plc
lexicon
multiformats
nsid
xrpc

プロジェクトに依ってはコマンドの実行時に次のようなエラーメッセージが出力される場合があります。

Cannot override workspace packages.

Package `at_identifier` at `./packages/at_identifier` is overridden in `packages/bluesky/pubspec.yaml`.

これはWorkspacesが導入される前にローカルの依存性を上書きするために使用されていたpubspec_overrides.yamlと競合しているために発生します。

Workspacesを導入するに当たっては、これまで使用してきたpubspec_overrides.yamlについてもworkspaceに置き換えていく必要があります。

カスタムスクリプトを移行する

これまでmelos.yamlに定義していたscriptsなどのカスタムスクリプトは、ルートのpubspec.yamlに次のように追加します。

melos.yamlは廃止されましたがmelosの基本コマンドは変更されることなく引き継がれています。

そのため、次のようにルートのpubspec.yamlにmelosセクションを追加して、これまでmelos.yamlに定義していたscriptsセクションをコピペするだけでこれまで通りに動作します。

name: atproto_dart
publish_to: none
environment:
  sdk: ">=3.8.0 <4.0.0"
workspace:
  - packages/at_identifier
  - packages/at_uri
  - packages/atproto
  - packages/atproto_core
  - packages/atproto_oauth
  - packages/bluesky
  - packages/bluesky_cli
  - packages/bluesky_text
  - packages/did_plc
  - packages/lexicon
  - packages/multiformats
  - packages/nsid
  - packages/xrpc

dev_dependencies:
  melos: ^7.1.0

melos:
  scripts:
    hello: echo 'Hello World'

上記のカスタムスクリプトを実行するには、次のようにmelosコマンドを実行してください。

melos hello

上記のコマンドを実行すると、カスタムスクリプトが動作することを確認できました。

melos run hello
  └> echo 'Hello World'
     └> RUNNING

Hello World
Shinya

フリーランス。プログラマー歴10年以上。Amazoned Programmer (Amazonの企業文化に感銘を受けたプログラマー)。

仕事ではJavaとSQLとかを主に使ってアプリケーションを開発しています。BIツールを使用したビッグデータの可視化や解析から、AWSなどのクラウド技術の活用に興味があり、日々研究と研鑽を重ねています。このブログでは日々の学習のアウトプットを投稿していこうと思います。

暇な時にDart/Flutterのパッケージ開発やアプリ開発なども行なっており、OSSのatproto.dartを開発してたりします。

Shinyaをフォローする
DartFluttermelosProgrammingTechTool
Shinyaをフォローする
タイトルとURLをコピーしました