現代的なプログラミングには欠かせないパッケージマネージャーですが、Bundlerと同じ感覚でyarnを使ったところ、ハマる例が出てしまいました。
失敗談
Bundlerで一気にアップデートしたら、必要ないパッケージまで上がってしまって困った、ということがあったので、yarnでも同様にyarn upgrade some-package
のようにして、1つのパッケージだけバージョンを上げようとしました。
ところが、それを行ったあとにバンドル後のJavaScriptを見れば、一気に容量が膨れ上がっていました。確認してみると、内部で使っているパッケージの違うバージョン2つが取り込まれてしまっていたのでした。
事態の問題点
同じパッケージが複数入ってしまうと、当然容量は増えますし、それ以外にもルーターなど状態を持つパッケージが複数入ってしまうと、「ルーターA」と「ルーターB」で別の状態を持つ、なんてことになってしまって、正常動作しなくなります。
傾向と対策
Bundlerでは「同じパッケージは1つしか入れられない」のですが、Node.js環境ではパッケージをグローバルにさらさず、require
やimport
でローカルな名前をつける形となるので、同じパッケージを複数インストールすることも可能なのです。これが逆に仇となったわけです。
そして、一部だけupgrade
すると、指定したパッケージの依存パッケージまでまとめてupgrade
されるので、upgrade
しないパッケージとの間でバージョン差が出てしまいます。yarnについては、「基本yarn upgrade
で更新して、特定バージョンがまずい場合にはpackage.json
に明記する」という形にしたほうがいいかも知れません。