はじめに
Yarnを使ったモノレポ開発で、似たようなコマンドがいくつかあります:
yarn [command]
yarn workspaces
yarn workspaces foreach
これらの違いについて、サンプルプロジェクトを使って具体的に解説します。
サンプルプロジェクト構成
まずは簡単なモノレポ構成のプロジェクトを作ってみましょう:
my-monorepo/
├── package.json
├── packages/
│ ├── common/
│ │ ├── package.json
│ │ └── src/
│ ├── frontend/
│ │ ├── package.json
│ │ └── src/
│ └── backend/
│ ├── package.json
│ └── src/
ルートの package.json
{
"private": true,
"workspaces": [
"packages/*"
],
"scripts": {
"lint": "eslint . -f stylish",
"build": "echo 'Running root build'"
}
}
packages/common/package.json
{
"name": "@my-app/common",
"version": "1.0.0",
"scripts": {
"build": "echo 'Building common package'"
}
}
packages/frontend/package.json
{
"name": "@my-app/frontend",
"version": "1.0.0",
"dependencies": {
"@my-app/common": "1.0.0"
},
"scripts": {
"build": "echo 'Building frontend package'"
}
}
packages/backend/package.json
{
"name": "@my-app/backend",
"version": "1.0.0",
"dependencies": {
"@my-app/common": "1.0.0"
},
"scripts": {
"build": "echo 'Building backend package'"
}
}
コマンドの違いを見てみよう
1. yarn [command]
これは単純にルートpackage.jsonに定義されたスクリプトを実行します。
$ yarn lint
# -> ルートのpackage.jsonで定義されたlintスクリプトを実行
# -> プロジェクト全体のlintが走る
$ yarn build
# -> "Running root build"と表示される
# -> サブパッケージのbuildは実行されない
2. yarn workspaces run [command]
全てのワークスペース(サブパッケージ)で同じコマンドを実行します。
$ yarn workspaces run build
# 出力:
# Building common package
# Building frontend package
# Building backend package
ただし:
- 実行順序は制御できない
- 特定のパッケージだけを実行することはできない
- 並列実行のオプションはない
3. yarn workspaces foreach [options] [command]
最も柔軟な制御が可能です。
# 並列実行(-p)
$ yarn workspaces foreach -p run build
# -> 全パッケージのbuildを並列で実行
# 依存関係順の実行(-t)
$ yarn workspaces foreach -t run build
# -> common → frontend/backend の順で実行
# 特定パッケージのみ実行
$ yarn workspaces foreach --from "@my-app/frontend" run build
# -> frontendパッケージのみビルド
# 除外して実行
$ yarn workspaces foreach --exclude "@my-app/backend" run build
# -> backend以外のパッケージをビルド
よく使用するオプション:
-
-p
: 並列実行 -
-t
: トポロジカル順(依存関係順)で実行 -
-R
: 再帰的に実行 -
-i
: インタラクティブモード -
--from
: 対象パッケージを指定 -
--exclude
: 除外パッケージを指定
まとめ
- 単一のコマンド実行 →
yarn [command]
- 全ワークスペースで同じ操作 →
yarn workspaces run [command]
- 高度な制御が必要 →
yarn workspaces foreach [options] [command]
使用するコマンドは、実行したい操作と必要な制御レベルによって選択しましょう。yarn workspaces foreach
は便利ですが、シンプルな操作には他のコマンドの方が適している場合もあります。