【ツール活用|実務向け】pnpm で実現する快適なモノレポ開発:ディスク効率とビルド速度の最適化

導入

近年のフロントエンド開発やマイクロサービス開発において、複数のプロジェクトを単一のリポジトリで管理する「モノレポ」構成を採用するチームが増えています。しかし、npmやyarnを使用すると、各パッケージごとに`node_modules`が肥大化し、ディスク容量の圧迫やインストール時間の増大といった課題に直面しがちです。本記事では、これらを解決する次世代パッケージマネージャ「pnpm」を活用した、効率的なモノレポ管理術を解説します。

基礎知識

pnpmが他のツールと決定的に異なるのは「コンテンツアドレサブルストレージ」という仕組みです。全プロジェクトで共有されるグローバルストアから、必要なパッケージをハードリンクおよびシンボリックリンクで`node_modules`に展開します。これにより、同じ依存関係を複数回ダウンロード・コピーすることなく、ディスク容量を劇的に節約できます。また、モノレポにおいて必須となる「Workspaces」機能により、リポジトリ内のパッケージ間依存を透過的に解決し、ビルドやテストの実行を最適化することが可能です。

実装/解決策

pnpmでモノレポを構築するには、ルートディレクトリに`pnpm-workspace.yaml`を配置し、各パッケージを管理します。これにより、ローカルパッケージ間の参照を自動的に解決し、開発効率を大幅に向上させることができます。

サンプルプログラム

以下の手順でモノレポ環境を構築できます。

1. ルートディレクトリの設定 (pnpm-workspace.yaml)
packages:

  • ‘packages/’ # パッケージを格納するディレクトリを指定

2. パッケージ内から別のパッケージを依存関係に追加する例
packages/app-a から packages/shared-utils を依存させる
cd packages/app-a
pnpm add @my-repo/shared-utils –workspace

3. 依存関係を解決して全パッケージを一括ビルドするスクリプト (package.json)
{
“name”: “my-monorepo”,
“private”: true,
“scripts”: {
# –recursive (-r) で全ワークスペースに対してコマンドを実行
# –filter で特定のパッケージのみを対象にすることも可能
“build”: “pnpm -r build”,
“test”: “pnpm -r test”
}
}

応用・注意点

現場での運用において陥りやすいのが「依存関係の漏れ」です。pnpmはデフォルトで、`package.json`に明示的に記載されていないパッケージを`node_modules`から参照できないよう厳格に制御します(フラットな`node_modules`構造を強制しないため)。これは「幽霊依存(依存先の依存先を勝手に使ってしまうこと)」を防ぐメリットがありますが、古いコードベースを移行する際にはエラーが発生しやすくなります。その場合は、`public-hoist-pattern`設定を使用して一部の依存関係を強制的にホイスティングするか、必要なパッケージを明示的にインストールし直す運用が必要です。また、CI環境では`pnpm store prune`を定期的に実行し、古いキャッシュをクリーンアップすることでストレージの最適化を維持することをお勧めします。

コメント

タイトルとURLをコピーしました