yarn は file: と link: で扱いを変えられる
file の場合はパッケージのフォルダを node_modules 内にコピーして link の場合はシンボリックリンクを作る
npm は file しかなくて file でシンボリックリンクが作られる
コピーはほぼ使わないから これだけだと npm でも問題ない
npm はリンクするパッケージ内の dependencies の扱いで問題が出る
リンク先がプロジェクト内のサブフォルダだと devDependencies も含めてインストールされる
プロジェクトのサブプロジェクトならテストなど開発用機能も使うだろうという判断?
実際には npm ライブラリをベースにバグ修正や自分用にカスタマイズで少しだけいじったものと置き換える使い方が多い
そういうときに devDependencies は要らない
だけどこれを除外する方法がなさそう
devDependencies を消して対処しかない?
workspace が使われてるパッケージだと devDependencies は workspace を前提にしていて単独だとインストールできない場合もある
production モードでインストールすれば devDependencies のインストールは回避できたと思うけど この方法だとメインの devDependencies も入らなくなってしまう
メインの devDependencies にはフォーマッターやテストなどの必要なものがあるのでインストールされないのは困る
またリンク先がプロジェクトフォルダの外だと動作が変わる
単にリンクされるだけで dependencies すらインストールされない
手動でリンク先で npm install コマンドを実行しろってことみたい
プロジェクト外なら複数箇所で共有されてるかもしれないからそのパッケージフォルダ内に node_modules を作って共有するというのもわからなくはないけど
ただ実際にはこれらの機能は使いづらいだけ
yarn ならプロジェクトの内外を気にせず リンクしたパッケージは他のパッケージと同じように扱われて dependencies のみインストールされる
これが求めてる挙動だけど npm だと同じことをする方法がなさそう
経験がないけど yarn の挙動だと問題が出る可能性はあるのかも
バージョン競合で node_modules 内のパッケージの中に node_modules がネストして作られることがある
そのときにリンクしたパッケージ内に部分的な node_modules ができて気持ち悪いことになる可能性があるのかも
1 箇所からの使用なら別にも気にしなければいいだけだけど 複数箇所からリンクしてると部分的な node_modules は問題になる可能性も?