追記(2019/03/18): yarn-toolsからyarn-deduplicateが独立して使いやすくなり、 --strategy
でdedupeの方法を選べるようになっています。タイトルも変更しました。
yarnpkg(1) を使って依存関係を管理しているとき、 yarnpkg upgrade-interactive
は対話的にライブラリのアップデートができるので大変便利です。しかし、これを実行すると yarn.lock
に不必要に重複エントリが作られることがよくあります。
nodejsで実行するケースでは重複があっても問題がないことが多いのですが、 クライアントサイドでは重複があると単純にファイルサイズが大きくなり。また、@types/*
や react, jquery といったフレームワークはどの環境でも動作に問題が出たりするので、重複エントリは問題です*1。そこで今までは、 yarnpkg upgrade-interactive
後に 差分を眺めて重複エントリを1つにまとめるというタスクを手動でやっていました。
とはいえこの yarn.lock 最適化ロジックは機械的にできるはずなので、いいツールはないかと探していて、なければ作るのでもいいかと思っていいたところ、 yarn-deduplicate(1) というツールがその機能を提供しているようでした。
手元のかなり大きな yarn.lock
でもちゃんと動いたので、 package.json の scripts セクションに次のようなdedupe scriptを登録して、 npm run dedupe
で運用していこうと思います。
npx yarn-deduplicate --strategy=fewer && yarn install --force
こういうとき、 npx(1)
を使うとプロジェクトの依存関係をいじらなくて済むのでいいですね。
*1:特にTypeScriptの型定義はグローバルスコープだったりするので、微妙に異なるバージョンの .d.ts が node_modules 以下に復数存在すると TS2300: Duplicate identifier が起きがちです。