Closed8

yarn workspaces について調べる

uttkuttk

このスクラップについて

yarn workspaces について調査します。

検証する yarn のバージョン
$> yarn -v
3.3.0
uttkuttk

フォルダー構造について

フォルダー構造は以下のような感じになります👇

.
├── packgages/
│   ├── a-lib/
│   │   ├── index.js
│   │   └── package.json
│   └── b-lib/
│       ├── index.js
│       └── package.json    
└── package.json
uttkuttk

ルートにパッケージをインストール

実行したコマンド
# ルートフォルダーで実行
$> yarn add -D typescript

※ yarn v3 だと、-W フラグいらなかったです 👀

そして、node_modules は以下のようになりました👇

./node_modules
node_modules/
├── .bin
├── typescript
└── .yarn-state.yml

特に変わった所は無いかな?
一応、yarn v3 だと .yarn フォルダーにキャッシュ( cache, install-state.gz )が作られるみたいだった👀

uttkuttk

workspace にパッケージをインストール

まずは、ルートにインストールされているパッケージをインストールしてみる。

実行したコマンド
$> cd ./packages/a-lib
$> yarn add -D typescript

結果、node_modules は作成されなかった。
これはデフォルトで巻き上げ ( hoisting ) が発生したため。

これを workspace 内にインストールしたい場合は、.yarnrc.ymlnmHoistingLimits を設定してあげる必要がある👇

.yarnrc.yml
+ nmHoistingLimits: dependencies 

すると、そのままインストールされた 👀

./packages/a-lib/node_modules
node_modules/
├── .bin
└── typescript
uttkuttk

workspace に他の workspace をインストール ( ローカルパッケージのインストール )

以下のコマンドを実行

$> cd ./packages/a-lib
$> yarn add b-lib

すると、package.json には "b-lib": "workspace:^" が追記される👇

./packages/a-lib/package.json
{
  // ...
+ "dependencies": {
+   "b-lib": "workspace:^"
+ }
}

しかし、デフォルトでは巻き上げ( hoisting ) が発生するため node_moduels は作成されなかった。
代わりにルートの node_modules にインストールされる👇

./node_modules
node_modules/
├── .bin
├── a-lib ⏎
├── b-lib ⏎
└── typescript

※ この時の a-libb-lib はシンボリックリンクになってます。

この挙動が嫌な場合は、 nmHoistingLimitsdependencies に設定するとworkspace 内に node_modules が作成されて、そこにインストールされるようになった👇

./packages/a-lib/node_modules
node_modules/
├── .bin
├── b-lib ⏎
└── typescript

※ この時の b-lib はシンボリックリンクになってます。

uttkuttk

workspace の npm scripts を実行する

ルートで workspace の npm scripts を実行したい場合は、yarn workspace コマンドを使用する。

./packages/a-lib/package.json
{
  // ...
  "scripts": {
    "hello": "echo \"hello world!\""
  },
  // ...
}

コマンドは以下のようにする 👇

$> yarn workspace a-lib hello
hello world!
uttkuttk

全ての workspace の npm scripts を実行する

yarn だけでは出来ないが、 workspace-tools を使用すると出来るようになる。( README.md によると Yarn v4 からはデフォルトで入るようになるらしい。2022/12/20現在 )

# plugin をインストール
$> yarn plugin import workspace-tools

# 全ての workspace の "hello" を実行する
$> yarn workspaces foreach run hello
➤ YN0000: hello world!
➤ YN0000: hello world!
➤ YN0000: Done in 0s 96ms

ちなみに、"hello" が無い workspace があっても正常に実行されました。

yarn workspaces foreachコマンドのオプションなどは以下を参照👇

https://yarnpkg.com/cli/workspaces/foreach

uttkuttk

全ての workspace の package.json のバージョンをあげる

yarn では無理そう。知っている人が居たら教えて🙏

このスクラップは2023/03/02にクローズされました