yarn workspaceで同一workspace内のパッケージを追加するときの注意点


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
package.json
{
  "private": true,
  "version": "0.0.0",
  "workspaces": [
    "packages/*"
  ],
  "license": "MIT"
}
packages/test-app/package.json
{
  "name": "test-app",
  "version": "1.0.0",
  "main": "index.js",
  "license": "MIT",
  "dependencies": {}
}
packages/common/package.json
{
  "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
└─ [email protected]
✨  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
└─ [email protected]
✨  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
├─ [email protected]
└─ [email protected]
   └─ common@*
✨  Done in 0.07s.

ちなみに、ローカルのパッケージをインストールした時は、yarn.lockファイルは更新されないみたい。

yarn.lock
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
# yarn lockfile v1


結論

yarnでworkspace使ってる時に依存関係でローカルのパッケージを追加したいときは、バージョン指定する!
そもそも公開する予定の無いパッケージでも事故を防ぐためにnpmに登録されているものとは別の名前を使っといた方が良さそう。

あ、あと、yarn workspaceコマンドで指定するworkspace名はパッケージの名前なので注意。