charcoal icon indicating copy to clipboard operation
charcoal copied to clipboard

yarn → pnpm 移行(各パッケージの依存のインストール忘れを検知できるようにする)

Open fsubal opened this issue 2 years ago • 8 comments

必要だと思う機能の内容を書いてください

各パッケージの依存のインストール忘れを検知できるようにするツールを使いたい。

選択肢としては以下の通り

  • 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のみサポート) 制限なし 制限なし

fsubal avatar Mar 08 '23 08:03 fsubal

ちなみに私は pnpm 推しです

fsubal avatar Mar 08 '23 08:03 fsubal

パッケージマネージャはそのままで、eslint-plugin-import などでおかしな import を検知する https://zenn.dev/yusukehirao/articles/no-extraneous-dependencies

最近使っていますが結構いい感じでした。ただ vscode で使用しているときに package.json が更新されたときに vscode eslint extension の再起動が必要なので、事前に弾かれる pnpm は良さそうだなと思っています。

naporin0624 avatar Mar 08 '23 08:03 naporin0624

peer dependencies が pnpm の機能で auto install できるのを良しとすべきなのかが分かってない( 依存の依存の peer dependencies を我々側は明示すべきなのか? 利用側のプロダクトが peer dependencies の入れ忘れをするなら意味がないのか? )。

fsubal avatar Mar 08 '23 08:03 fsubal

eslint-plugin-import と pnpm は別に両方入れても良い( いや、前者だけで済むよみたいな根拠がない限りは )

fsubal avatar Mar 08 '23 09:03 fsubal

yarn PnP を採用すると VSCode 以外のエディタからはコントリビュートしづらくなるという理由で、pnpm または eslint-plugin-import を推します

saitolume avatar Mar 08 '23 10:03 saitolume

  • 未検証ですが、dependenciesに追加されていてほしいものがdevDependenciesにあったときにエラーを吐いてくれるのはeslint-plugin-importだけだったと思います。ただ@types/*のインストール忘れは検知できないはずです。
  • Yarn PnPはWebStorm/PhpStormで動きますし、TypeScript LSPサーバーでも動くらしいですのでエディタサポートについてはそれほど心配ないと思います。
  • Yarn PnPにした場合、Yarn PnPに対応しているモジュールバンドラやテストランナーしか使えないので注意が必要です。Microbundleとesbuildは対応してます。

ciffelia avatar Mar 13 '23 02:03 ciffelia

1個懸念を書くのを忘れてた。pnpm は dependabot でサポートされていなそう

https://github.com/dependabot/dependabot-core/issues/1736

yarn v2 もつい最近までなかったのでいまさら感はあるが、やはり renovate しか選択肢がないという状況になりそう

fsubal avatar Mar 14 '23 03:03 fsubal

pnpm サポートされてた

https://github.com/dependabot/dependabot-core/issues/1736#issuecomment-1588051751

fsubal avatar Jun 26 '23 08:06 fsubal