GitHub Codespacesでnpmからpnpmへ移行する

読了時間: 4分
GitHub Codespacesでnpmからpnpmへ移行する のサムネイル

概要

このブログの開発環境であるGitHub Codespacesで、パッケージマネージャをデフォルトで設定されているnpmからpnpmに移行しました。

pnpmは、高速なインストール速度とディスク容量の効率的な使用が特徴のパッケージマネージャです。GitHub Codespacesでは、Corepackによる自動セットアップとdevcontainer.jsonの設定だけで、スムーズに移行できます。

この記事では、実際に行った設定変更と移行手順について、具体的な変更箇所をメモとして残しておきます。この記事はGitHub Codespacesを使用している環境を前提としています。DevContainerの基本については、別記事「DevContainerの基礎知識:開発環境をコードで定義する」を参照してください。

pnpmの特徴と選択理由

pnpm(performant npm)は、npmやYarnの代替となる高速で効率的なパッケージマネージャです。

pnpmには次のような特徴があります。

  • npmと比較して2〜3倍高速な依存関係のインストール
  • パッケージをグローバルストアに保存し、プロジェクトごとにハードリンクを作成するため、ディスク容量を節約
  • package.jsonに明示的に記載されていない依存関係へのアクセスを防ぎ、依存関係の問題を早期発見
  • ワークスペース機能により、monorepoなど複数パッケージを含むリポジトリの管理が容易

このプロジェクトでは、ビルド時間の短縮とCI環境でのディスク使用量削減を目的にpnpmを採用しました。

移行手順

npmからpnpmへの移行には、5つのステップが必要です。

  1. package.jsonにパッケージマネージャのバージョンを明示
  2. Codespaces用のdevcontainer.json設定ファイル作成
  3. npm関連ファイルの削除と依存関係の再インストール
  4. 既存環境での動作確認
  5. 新規Codespacesでの自動セットアップ確認

それぞれの手順を詳しく見ていきます。

1. package.jsonの設定

packageManagerフィールドを追加して、使用するpnpmのバージョンを明示します。

package.jsonJSON
{
  "name": "your-project",
  "version": "1.0.0",
  "packageManager": "pnpm@10.23.0",
  "scripts": {
    ...
  }
}

このフィールドにより、Node.jsのCorepackが自動的に指定バージョンのpnpmを使用します。

2. devcontainer.jsonの設定

GitHub Codespacesでは、.devcontainer/devcontainer.jsonを設定してpnpmを自動セットアップします。

.devcontainer/devcontainer.jsonJSON
{
  "name": "your-project",
  "postCreateCommand": "pnpm install",
  "customizations": {
    "vscode": {
      "settings": {
        "npm.packageManager": "pnpm"
      },
      "extensions": [
        "dbaeumer.vscode-eslint",
        "biomejs.biome"
      ]
    }
  },
  "forwardPorts": [3000]
}

これらの設定で、Codespacesの起動時にCorepackが自動的にpnpmをインストールし、postCreateCommandで依存関係がインストールされます。

Corepackによる自動セットアップ

Node.js 16.9.0以降にバンドルされているCorepackが、package.jsonpackageManagerフィールドを読み取り、指定されたバージョンのpnpmを自動的にダウンロード・使用します。

DevContainer環境ではCorepackが自動的に有効化されますが、ローカル環境では初回のみcorepack enableの実行が必要な場合があります。

3. npm関連ファイルの削除と依存関係の再インストール

既存のnode_modulespackage-lock.jsonを削除し、pnpmで依存関係を再インストールします。

Bash
rm -rf node_modules package-lock.json
pnpm install

インストール実行後、pnpm-lock.yamlが生成されます。

4. 既存環境での動作確認

開発サーバーを起動して、移行が正しく完了したことを確認します。

Bash
pnpm run dev

問題なく起動したら、型チェックとビルドを実行します。

Bash
# 型チェック
pnpm run type-check

# ビルド
pnpm run build

もし型定義に関するエラーが発生した場合、pnpmの厳格な依存管理が原因の可能性があります。npmでは暗黙的に利用できていたパッケージも、pnpmでは明示的なインストールが必要です。エラーメッセージに従って必要なパッケージを追加インストールしてください。

Bash
# 例: 型定義が見つからない場合
pnpm add -D @types/パッケージ名

5. 新規Codespacesでの自動セットアップ確認

動作確認が完了したら、変更した設定ファイルをコミットします。Codespacesの管理画面から新しいCodespacesを作成し、自動セットアップが正しく動作するか確認してください。

問題なくビルドが完了し、開発サーバーが起動すれば、移行は成功です。

まとめ

GitHub Codespacesでnpmからpnpmへの移行を実施しました。Corepackによる自動セットアップにより、package.jsondevcontainer.jsonの設定のみで移行が完了します。

pnpmの導入により、依存関係のインストール時間が短縮され、ディスク使用量も削減されました。厳格な依存管理により、暗黙的な依存関係の問題も早期に発見できます。

既存のCodespaces環境でパッケージマネージャの変更を検討している場合、この手順を参考に移行を進めてください。

この記事はお役に立ちましたか?

皆様の フィードバック が励みになります!

ボタンを押して記事が役に立ったことを伝える

筆者にコーヒーを奢る(Buy Me a Coffee)

コーヒーを奢る

この記事をシェア

X
Facebook
はてな
URLをコピー
utsusieのプロフィール画像

utsusie

UI Designer / Web Director

Lv.0
STR
LDR
EXP
TEC
LCK