yarn → pnpm 移行(各パッケージの依存のインストール忘れを検知できるようにする)
必要だと思う機能の内容を書いてください
各パッケージの依存のインストール忘れを検知できるようにするツールを使いたい。
選択肢としては以下の通り
- Yarn の PnP モードに移行する
- https://github.com/pixiv/charcoal/pull/240
- Yarn をやめて pnpm に移行する
- https://github.com/pixiv/charcoal/pull/250
- パッケージマネージャはそのままで、eslint-plugin-import などでおかしな import を検知する
- https://zenn.dev/yusukehirao/articles/no-extraneous-dependencies
この機能が必要と考えられる理由を書いてください
https://github.com/pixiv/charcoal/pull/226
現状だとモノレポ内のすべてのパッケージが同じ node_modules を共有しており、各パッケージの package.json に必要な依存が書かれていなかったとしてもなんとなく動いてしまう問題がある。
( たとえば、 @types/react をインストールし忘れてるパッケージがいくつかあるが、特に型エラーにならないので放置されたり気づかないままになってたりする )
これにより、本来 dependencies として追加されてほしいものが誤って devDependencies から読まれてしまう、意図しないものがバンドルされてしまうなどの問題が起こっている
この機能があった場合にどういう動きをするかの例を書いてください
雑に星取表を書くと以下のようになるはず。詳しくは各ツールの PR を参照
| Yarn PnP | pnpm | eslint-plugin-import | |
|---|---|---|---|
| 依存追加忘れ | インストール時エラー | インストール時エラー | lintエラー |
| peer dependencies | つど package.json に追加 | auto install あり | 何もしない |
| エディタサポート | プラグインが必要(VSCodeのみサポート) | 制限なし | 制限なし |
ちなみに私は pnpm 推しです
パッケージマネージャはそのままで、eslint-plugin-import などでおかしな import を検知する https://zenn.dev/yusukehirao/articles/no-extraneous-dependencies
最近使っていますが結構いい感じでした。ただ vscode で使用しているときに package.json が更新されたときに vscode eslint extension の再起動が必要なので、事前に弾かれる pnpm は良さそうだなと思っています。
peer dependencies が pnpm の機能で auto install できるのを良しとすべきなのかが分かってない( 依存の依存の peer dependencies を我々側は明示すべきなのか? 利用側のプロダクトが peer dependencies の入れ忘れをするなら意味がないのか? )。
eslint-plugin-import と pnpm は別に両方入れても良い( いや、前者だけで済むよみたいな根拠がない限りは )
yarn PnP を採用すると VSCode 以外のエディタからはコントリビュートしづらくなるという理由で、pnpm または eslint-plugin-import を推します
- 未検証ですが、dependenciesに追加されていてほしいものがdevDependenciesにあったときにエラーを吐いてくれるのはeslint-plugin-importだけだったと思います。ただ
@types/*のインストール忘れは検知できないはずです。 - Yarn PnPはWebStorm/PhpStormで動きますし、TypeScript LSPサーバーでも動くらしいですのでエディタサポートについてはそれほど心配ないと思います。
- Yarn PnPにした場合、Yarn PnPに対応しているモジュールバンドラやテストランナーしか使えないので注意が必要です。Microbundleとesbuildは対応してます。
1個懸念を書くのを忘れてた。pnpm は dependabot でサポートされていなそう
https://github.com/dependabot/dependabot-core/issues/1736
yarn v2 もつい最近までなかったのでいまさら感はあるが、やはり renovate しか選択肢がないという状況になりそう
pnpm サポートされてた
https://github.com/dependabot/dependabot-core/issues/1736#issuecomment-1588051751