1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Yarnのworkspacesコマンドの違いを理解する

Posted at

はじめに

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は便利ですが、シンプルな操作には他のコマンドの方が適している場合もあります。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?