npm vs pnpm: CI にはどちらの Node パッケージマネージャを選ぶか
pnpm は npm のフラットな node_modules をコンテンツアドレス方式の store に置き換え、CI では通常それがより高速な install と大幅に少ないディスクの入れ替わりを意味します。
npm は Node に同梱されるデフォルトのパッケージマネージャです。pnpm はハードリンクを用いたグローバルなコンテンツアドレス方式の store を使い、install を高速化し、ディスクを節約し、より厳格な依存関係の解決を強制します。
| npm | pnpm | |
|---|---|---|
| インストール速度 | ベースライン | より高速 (リンクされた store) |
| ディスク使用量 | プロジェクトごとに完全コピー | 共有 store、ハードリンク |
| Lockfile | package-lock.json | pnpm-lock.yaml |
| CI での install | npm ci | pnpm install --frozen-lockfile |
| monorepo サポート | Workspaces (基本) | Workspaces (強力) |
CI において
pnpm はほとんどの repo で npm より高速に install し、共有 store を通じてディスク使用量を削減するため、cache や workspace が大きい場合に役立ちます。その厳格で非フラットな node_modules は、npm が黙って許してしまう phantom dependencies も検出します。npm は、あらゆる CI イメージやチュートリアルがすでに前提とするセットアップ不要のデフォルトであり続けます。
store を cache する
依存関係の cache を pnpm-lock.yaml(npm なら package-lock.json)でキーづけし、pnpm の store ディレクトリを cache すると最大の実時間短縮が得られます。どちらを選んでも CI runner 上で同じように動作し、より高速なマネージド runner が install ステップをさらに短縮します。
結論
より高速な install、より少ないディスク使用、より厳格な解決が欲しいなら pnpm。セットアップ不要の普遍的なデフォルトが欲しいなら npm。いずれにせよ、lockfile を commit し、frozen install フラグを使い、store を cache してください。