yarn workspaces について調べる
フォルダー構造について
フォルダー構造は以下のような感じになります👇
.
├── packgages/
│ ├── a-lib/
│ │ ├── index.js
│ │ └── package.json
│ └── b-lib/
│ ├── index.js
│ └── package.json
└── package.json
ルートにパッケージをインストール
# ルートフォルダーで実行
$> yarn add -D typescript
※ yarn v3 だと、-W
フラグいらなかったです 👀
そして、node_modules は以下のようになりました👇
node_modules/
├── .bin
├── typescript
└── .yarn-state.yml
特に変わった所は無いかな?
一応、yarn v3 だと .yarn
フォルダーにキャッシュ( cache, install-state.gz )が作られるみたいだった👀
workspace にパッケージをインストール
まずは、ルートにインストールされているパッケージをインストールしてみる。
$> cd ./packages/a-lib
$> yarn add -D typescript
結果、node_modules は作成されなかった。
これはデフォルトで巻き上げ ( hoisting ) が発生したため。
これを workspace 内にインストールしたい場合は、.yarnrc.yml
に nmHoistingLimits を設定してあげる必要がある👇
+ nmHoistingLimits: dependencies
すると、そのままインストールされた 👀
node_modules/
├── .bin
└── typescript
workspace に他の workspace をインストール ( ローカルパッケージのインストール )
以下のコマンドを実行
$> cd ./packages/a-lib
$> yarn add b-lib
すると、package.json には "b-lib": "workspace:^"
が追記される👇
{
// ...
+ "dependencies": {
+ "b-lib": "workspace:^"
+ }
}
しかし、デフォルトでは巻き上げ( hoisting ) が発生するため node_moduels は作成されなかった。
代わりにルートの node_modules にインストールされる👇
node_modules/
├── .bin
├── a-lib ⏎
├── b-lib ⏎
└── typescript
※ この時の a-lib
・b-lib
はシンボリックリンクになってます。
この挙動が嫌な場合は、 nmHoistingLimits を dependencies
に設定するとworkspace 内に node_modules が作成されて、そこにインストールされるようになった👇
node_modules/
├── .bin
├── b-lib ⏎
└── typescript
※ この時の b-lib
はシンボリックリンクになってます。
workspace の npm scripts を実行する
ルートで workspace の npm scripts を実行したい場合は、yarn workspace コマンドを使用する。
{
// ...
"scripts": {
"hello": "echo \"hello world!\""
},
// ...
}
コマンドは以下のようにする 👇
$> yarn workspace a-lib hello
hello world!
全ての 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
コマンドのオプションなどは以下を参照👇
全ての workspace の package.json のバージョンをあげる
yarn では無理そう。知っている人が居たら教えて🙏