yarnのworkspaceでモノレポしてる時に、workspace内のパッケージから同一workspace内のパッケージを追加しようとしたら、少し意図せぬ動きをしたのでメモ書き。
具体的には、add時にバージョン指定するとローカルのものが使われて、バージョン指定しないとnpmのサーバに取りに行く(ローカルはみない)動きになるみたい。
どうやら下の現象みたい。
https://github.com/yarnpkg/yarn/issues/4878
環境
yarnのバージョンはこれ
$ yarn -v
1.21.1
ファイル構成
こんな感じ
$ ls -R
package.json packages/
./packages:
common/ test-app/
./packages/common:
package.json
./packages/test-app:
package.json
{
"private": true,
"version": "0.0.0",
"workspaces": [
"packages/*"
],
"license": "MIT"
}
{
"name": "test-app",
"version": "1.0.0",
"main": "index.js",
"license": "MIT",
"dependencies": {}
}
{
"name": "common",
"version": "1.0.0",
"license": "MIT"
}
事象
前述の環境で、以下のコマンドでtest-appにcommonを追加してみる。
$ yarn workspace test-app add common
yarn workspace v1.21.1
yarn add v1.21.1
info No lockfile found.
[1/4] 🔍 Resolving packages...
[2/4] 🚚 Fetching packages...
[3/4] 🔗 Linking dependencies...
[4/4] 🔨 Building fresh packages...
success Saved lockfile.
success Saved 1 new dependency.
info Direct dependencies
info All dependencies
└─ common@0.2.5
✨ Done in 0.38s.
✨ Done in 0.67s.
commonはnpmに上がっている方のcommonが利用されている…(https://www.npmjs.com/package/common)
今度は、バージョン指定ありでcommonをインストールしてみる。
$ yarn workspace test-app add common@*
yarn workspace v1.21.1
yarn add v1.21.1
[1/4] 🔍 Resolving packages...
[2/4] 🚚 Fetching packages...
[3/4] 🔗 Linking dependencies...
[4/4] 🔨 Building fresh packages...
success Saved lockfile.
success Saved 1 new dependency.
info Direct dependencies
info All dependencies
└─ common@1.0.0
✨ Done in 0.12s.
✨ Done in 0.41s.
今度はローカルにある方のパッケージが追加されている。
一度消して、再度インストールしてみても同じ。
$ rm -rf node_modules
$ yarn install
yarn install v1.21.1
[1/4] 🔍 Resolving packages...
[2/4] 🚚 Fetching packages...
[3/4] 🔗 Linking dependencies...
[4/4] 🔨 Building fresh packages...
success Saved lockfile.
✨ Done in 0.11s.
$ yarn list
yarn list v1.21.1
├─ common@1.0.0
└─ test-app@1.0.0
└─ common@*
✨ Done in 0.07s.
ちなみに、ローカルのパッケージをインストールした時は、yarn.lockファイルは更新されないみたい。
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
# yarn lockfile v1
結論
yarnでworkspace使ってる時に依存関係でローカルのパッケージを追加したいときは、バージョン指定する!
そもそも公開する予定の無いパッケージでも事故を防ぐためにnpmに登録されているものとは別の名前を使っといた方が良さそう。
あ、あと、yarn workspaceコマンドで指定するworkspace名はパッケージの名前なので注意。