概要
Yarnは、Facebookによって開発されたパッケージマネージャーであり、npmの代替として高速なインストールと信頼性の高い依存関係管理を提供する。
Yarn Classicは安定性を重視する場合に適しており、Yarn Berryは最新の機能とパフォーマンスを求める場合に適している。
pnpmは、ディスク効率とパフォーマンスに特化しており、コンテンツアドレサブルストレージによる効率的なパッケージ管理を実現する。
厳密な依存関係管理により、予期しない動作を防ぎ、大規模プロジェクトでの使用に適している。
これらのツールは、Node.jsがインストールされていることを前提としている。
プロジェクトの要件、チームの慣習、パフォーマンスの要求に応じて、適切なパッケージマネージャーを選択することが重要である。
これらのツールを適切に活用することで、効率的で保守性の高いNode.js開発環境を構築できる。
Yarn
Yarnは、Facebookによってリリースされたパッケージマネージャーであり、npmの代替として開発された。
Yarnの主な特徴は、高速なインストール、信頼性の高い依存関係の解決、セキュリティの強化である。
Yarnは、npmと互換性があり、同じpackage.jsonファイルを使用できる。
Yarnのインストール
Yarnには2つのメジャーバージョンが存在する。
- Yarn Berry (v4以降)
- 最新のYarnであり、Plug'n'Play機能や高速なインストール等の新機能を提供する。
- Node.js 16.10以降に同梱されているCorepackを使用してインストールすることが推奨される。
- Yarn Classic (v1.x)
- 従来のYarnであり、広範な互換性と安定性を提供する。
- npmや公式スクリプトを使用してインストールする。
環境や要件に応じて、適切なバージョンとインストール方法を選択する。
Corepackを使用したインストール (推奨)
Corepackは、Node.js 16.10以降に同梱されているパッケージマネージャーのバージョン管理ツールである。
Corepackを使用することで、プロジェクトごとに異なるバージョンのYarnを使い分けることができる。
Corepackを有効化する。
corepack enable
もし、Corepackがインストールされていない場合は、npm経由でインストールする。
npm install -g corepack
Yarnが使用可能になったことを確認する。
yarn --version
新しいプロジェクトを初期化する場合は、以下のコマンドを実行する。
yarn init -2
最新の安定版に更新する場合は、以下のコマンドを実行する。
yarn set version stable yarn install
特定のバージョンを指定してインストールする場合は、以下のコマンドを実行する。
# 特定のバージョンを指定 yarn set version 4.0.0 # リリース候補版 (テスト目的) yarn set version canary # ソースからビルド (開発目的) yarn set version from sources
Corepackを使用したインストールでは、Yarnのバイナリはプロジェクトの .yarn/releases/ ディレクトリに保存される。
このディレクトリと .yarnrc.yml ファイルをバージョン管理システムにコミットすることで、チーム全体で同じバージョンのYarnを使用できる。
Yarn Classicのインストール
Yarn Classic (v1.22) が必要な場合は、以下のいずれかの方法でインストールする。
npmを使用したインストール
npm経由でグローバルにYarn Classicをインストールする方法である。
この方法は、Node.jsとnpmが既にインストールされていることを前提としている。
npm install -g yarn
インストールが正常に完了したことを確認する。
yarn --version
公式インストールスクリプトを使用したインストール
公式のインストールスクリプトを使用する場合は、以下のコマンドを実行する。
このスクリプトは、Yarnを~/.yarnディレクトリにインストールし、シェルの設定ファイル (~/.bashrc、~/.zshrc、~/.config/fish/config.fish) に自動的に環境変数PATHを追加する。
curl -o- -L https://yarnpkg.com/install.sh | bash
Yarnが正常にインストールされたことを確認する。
yarn --version
パッケージ管理システムからインストール
Linuxディストリビューションのパッケージ管理システムを使用してYarnをインストールすることもできる。
# RHEL ## Yarnのリポジトリを追加 curl -sL https://dl.yarnpkg.com/rpm/yarn.repo -o /etc/yum.repos.d/yarn.repo ## Yarnをインストール sudo dnf install yarn # Debian ## Yarnの公式リポジトリを追加 curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add - echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list ## パッケージリストを更新してYarnをインストール sudo apt update && sudo apt install yarn
手動インストール
SUSEには公式リポジトリが存在しないため、手動インストールが必要となる。
Yarnの公式Webサイトにアクセスし、alternativesセクションから適切なバージョンをファイルをダウンロードする。
Tarballファイルをダウンロードして展開する。
curl -L https://yarnpkg.com/latest.tar.gz -o yarn.tar.gz tar xf yarn.tar.gz # 任意のディレクトリに配置 mv yarn-v<バージョン> <Yarnのインストールディレクトリ>
~/.profileファイル等に環境変数 PATH を追記する。
vi ~/.profile
# ~/.profileファイル
export PATH="/<Yarnのインストールディレクトリ>/bin:$PATH"
Yarnが正常にインストールされたことを確認する。
yarn --version
Yarnの使用方法
Yarnの基本的なコマンドは、npmと類似しているが、より簡潔な構文を提供している。
新しいプロジェクトを初期化する時は、以下に示すコマンドを実行する。
# 対話形式でpackage.jsonを作成 yarn init # デフォルト設定でpackage.jsonを作成 yarn init -y
package.jsonに記述された全ての依存関係をインストールする場合は、以下に示すコマンドを使用する。
# 全ての依存関係をインストール yarn install ## または yarn
新しいパッケージを追加する場合は、以下に示すコマンドを使用する。
# 本番環境で必要な依存関係として追加 yarn add <パッケージ名> # 開発環境でのみ必要な依存関係として追加 yarn add --dev <パッケージ名> ## または yarn add -D <パッケージ名> # 特定のバージョンを指定して追加 yarn add <パッケージ名>@<バージョン> # 複数のパッケージを同時に追加 yarn add <パッケージ1> <パッケージ2> <パッケージ3> # グローバルに追加 yarn global add <パッケージ名>
インストールされているパッケージを更新する。
# 全てのパッケージを更新 yarn upgrade # 特定のパッケージを更新 yarn upgrade <パッケージ名> # 特定のバージョンに更新 yarn upgrade <パッケージ名>@<バージョン> # インタラクティブに更新するパッケージを選択 yarn upgrade-interactive # 最新バージョンに更新 (メジャーバージョンを含む) yarn upgrade-interactive --latest
パッケージを削除する。
yarn remove <パッケージ名> # 複数のパッケージを同時に削除 yarn remove <パッケージ1> <パッケージ2>
インストールされているパッケージの一覧を表示する。
# ツリー形式で表示 yarn list # トップレベルのパッケージのみ表示 yarn list --depth=0 # 特定のパターンに一致するパッケージを表示 yarn list --pattern "パターン"
パッケージに関する情報を表示する。
yarn info <パッケージ名> # 特定のフィールドのみ表示 yarn info <パッケージ名> version yarn info <パッケージ名> dependencies
package.jsonに定義されているスクリプトを実行する。
yarn run <スクリプト名> # または yarn <スクリプト名> # 例 : テストスクリプトを実行 yarn test # 例 : ビルドスクリプトを実行 yarn build
パッケージの脆弱性を確認する。
yarn audit # 脆弱性の詳細を表示 yarn audit --level moderate
yarn.lockファイル
Yarnは、yarn.lockファイルを使用して依存関係のバージョンを固定する。
このファイルは、npmのpackage-lock.jsonに相当するものであり、チーム全体で一貫した依存関係を保証するために重要である。
yarn.lockファイルは、Yarnが依存関係をインストールする際に自動生成される。
yarn.lockファイルの特徴を以下に示す。
- インストールされた全てのパッケージの正確なバージョンを記録する。
- 依存関係の解決順序を保証し、異なる環境で同じ結果を得られるようにする。
- チームメンバー間での依存関係の不整合を防ぐ。
yarn.lockファイルは手動で編集する必要はなく、バージョン管理システムにコミットすることが推奨される。
プロジェクトを共有する際は、package.json、yarn.lock、.yarnrcファイル (存在する場合) を含める必要がある。
Yarnのキャッシュ管理
Yarnは、ダウンロードしたパッケージをローカルにキャッシュすることにより、インストール速度を向上させている。
キャッシュに関連する操作を以下に示す。
# キャッシュの場所を確認 yarn cache dir # キャッシュをクリア yarn cache clean # 特定のパッケージのキャッシュをクリア yarn cache clean <パッケージ名>
Yarn Berry (Yarn 4) 以降
Yarn 4以降は、Yarn Berryとして知られる新しいアーキテクチャを採用している。
Yarn Berryは、Yarn 1 (Classic) から大幅に刷新されており、以下に示す主要な機能が追加されている。
Yarn Berryの機能
Plug'n'Play (PnP) モードは、node_modulesディレクトリを生成せずに依存関係を管理する新しい仕組みである。
この機能により、インストール時間の短縮とディスク使用量の削減が実現される。
Zeroインストール機能は、.yarn/cacheディレクトリをバージョン管理に含めることで、npm install や yarn install を実行せずにプロジェクトを開始できる。
ワークスペース機能の強化により、モノレポ構成の管理がより効率的になっている。
また、プラグインシステムの導入により、機能を柔軟に拡張できる。
Yarn Berryへのアップグレード
既存のプロジェクトをYarn Berryにアップグレードする。
# Yarn 4以降にアップグレード yarn set version berry # または最新の安定版を指定 yarn set version stable # 特定のバージョンを指定 yarn set version 4.0.0
アップグレード後、.yarnrcファイルが.yarnrc.ymlファイルに置き換えられて、.yarn/releasesディレクトリにYarn本体が保存される。
これらのファイルとディレクトリは、バージョン管理システムにコミットすることが推奨される。
Plug'n'Play (PnP) モードの使用
PnPモードは、Yarn Berryのデフォルトモードである。
このモードでは、node_modulesディレクトリの代わりに.pnp.cjsファイルが生成され、依存関係の解決が高速化される。
PnPモードを無効にして従来のnode_modules方式を使用する場合は、.yarnrc.ymlファイルに以下の設定を追加する。
# .yarnrc.ymlファイル
nodeLinker: node-modules
設定変更後、依存関係を再インストールする必要がある。
yarn install
Zeroインストールの設定
Zeroインストール機能を有効にするには、.yarn/cacheディレクトリ および .pnp.cjsファイル をバージョン管理システムにコミットする。
.gitignoreファイルに以下の設定を追加する。
# .gitignore
# Yarn関連 (Zeroインストールを使用する場合)
.yarn/*
!.yarn/cache
!.yarn/patches
!.yarn/plugins
!.yarn/releases
!.yarn/sdks
!.yarn/versions
この設定により、チームメンバーはリポジトリをクローンした後、直ちにプロジェクトを実行できる。
Yarn Berryのワークスペース
Yarn Berryは、モノレポ構成を効率的に管理するためのワークスペース機能を提供している。
package.jsonファイルにワークスペースを定義する。
{
"name": "my-monorepo",
"private": true,
"workspaces": [
"packages/*",
"apps/*"
]
}
ワークスペース内のパッケージに対して、以下に示すコマンドを実行する。
# 特定のワークスペースでコマンドを実行 yarn workspace <パッケージ名> run build # 全てのワークスペースでコマンドを実行 yarn workspaces foreach run build # 並列実行 yarn workspaces foreach --parallel run build
Yarn Classic (Yarn 1) と Yarn Berry (Yarn 4以降) の選択
プロジェクトの要件に応じて、Yarn ClassicとYarn Berryのいずれかを選択する必要がある。
Yarn Classicは、安定性と広範な互換性を重視する場合に適している。
多くの既存プロジェクトで使用されており、トラブルシューティングのための情報が豊富である。
Plug'n'Play等の新機能は使用できないが、従来のnode_modules方式で安定した動作が保証される。
Yarn Berryは、最新の機能とパフォーマンスを重視する場合に適している。
Plug'n'Playモードによる高速なインストール、Zeroインストールによる効率的なCI/CD、プラグインシステムによる拡張性等のメリットがある。
ただし、一部のパッケージやツールとの互換性問題が発生する可能性があるため、プロジェクトの要件を慎重に評価する必要がある。
pnpm
pnpmは、パフォーマンスとディスク効率に特化したパッケージマネージャーである。
pnpmの最大の特徴は、コンテンツアドレサブルストレージを使用することで、同じパッケージの複数のバージョンを効率的に管理できる。
通常のnpmやYarnでは、プロジェクトごとにnode_modulesディレクトリにパッケージがコピーされるため、ディスク容量を大量に消費するが、
pnpmはハードリンクを使用してパッケージを共有するため、ディスク使用量を大幅に削減できる。
pnpmのインストール
公式インストールスクリプトを使用したインストール
公式のインストールスクリプトを使用する方法が推奨される。
curl -fsSL https://get.pnpm.io/install.sh | sh - # または wget -qO- https://get.pnpm.io/install.sh | sh -
インストールスクリプトは、pnpmをインストールして、シェルの設定ファイルに必要な環境変数を自動的に追加する。
pnpmが正常にインストールされたことを確認する。
pnpm --version
npmを使用したインストール
npm経由でグローバルにpnpmをインストールする場合は、以下に示すコマンドを実行する。
npm install -g pnpm
インストールが正常に完了したことを確認する。
pnpm --version
Cargoを使用したインストール
RustのパッケージマネージャーであるCargoを使用して、pnpmをインストールすることもできる。
この方法は、Rustがインストールされていることを前提としている。
cargo install pnpm
pnpmの使用方法
pnpmのコマンド構文は、npmと類似している。
新しいプロジェクトを初期化する時は、以下に示すコマンドを実行する。
pnpm init
package.jsonに記述された全ての依存関係をインストールする場合は、以下に示すコマンドを使用する。
# 全ての依存関係をインストール pnpm install ## または pnpm i
新しいパッケージを追加する場合は、以下に示すコマンドを使用する。
# 本番環境で必要な依存関係として追加 pnpm add <パッケージ名> # 開発環境でのみ必要な依存関係として追加 pnpm add --save-dev <パッケージ名> ## または pnpm add -D <パッケージ名> # 特定のバージョンを指定して追加 pnpm add <パッケージ名>@<バージョン> # 複数のパッケージを同時に追加 pnpm add <パッケージ1> <パッケージ2> <パッケージ3> # グローバルに追加 pnpm add -g <パッケージ名>
インストールされているパッケージを更新する。
# 全てのパッケージを更新 pnpm update # 特定のパッケージを更新 pnpm update <パッケージ名> # 最新バージョンに更新 (メジャーバージョンを含む) pnpm update --latest <パッケージ名> # インタラクティブに更新するパッケージを選択 pnpm update -i
パッケージを削除する。
pnpm remove <パッケージ名> # または pnpm rm <パッケージ名> # 複数のパッケージを同時に削除 pnpm remove <パッケージ1> <パッケージ2>
インストールされているパッケージの一覧を表示する。
# ツリー形式で表示 pnpm list # トップレベルのパッケージのみ表示 pnpm list --depth=0 # グローバルにインストールされているパッケージを表示 pnpm list -g
パッケージに関する情報を表示する。
pnpm view <パッケージ名> # 特定のフィールドのみ表示 pnpm view <パッケージ名> version pnpm view <パッケージ名> dependencies
package.jsonに定義されているスクリプトを実行する。
pnpm run <スクリプト名> # または一部のコマンドは短縮形で実行可能 pnpm test pnpm start
パッケージの脆弱性を確認クする。
pnpm audit # 脆弱性の自動修正 (可能な場合) pnpm audit --fix
pnpm-lock.yamlファイル
pnpmは、pnpm-lock.yamlファイルを使用して依存関係のバージョンを固定する。
このファイルは、YAML形式で記述されており、人間が読みやすい形式となっている。
pnpm-lock.yamlファイルの特徴を以下に示す。
- インストールされた全てのパッケージの正確なバージョンと整合性ハッシュを記録する。
- 依存関係の解決結果を保存し、異なる環境で同じ結果を保証する。
- YAML形式のため、差分が読みやすく、コードレビューが容易である。
pnpm-lock.yamlファイルは自動生成されるため、手動で編集する必要はなく、バージョン管理システムにコミットすることが推奨される。
pnpmのストア管理
pnpmは、全てのパッケージを中央ストアに保存し、プロジェクトからはハードリンクで参照する仕組みを採用している。
この仕組みにより、同じパッケージのバージョンを複数のプロジェクトで共有でき、ディスク使用量を大幅に削減できる。
ストアに関連する操作は以下の通りである。
# ストアの場所を確認 pnpm store path # 現在のプロジェクトで使用されていないパッケージをストアから削除 pnpm store prune # ストアの状態を確認 pnpm store status # ストアを完全にクリア (注意:全てのプロジェクトに影響する) rm -rf $(pnpm store path)
ストアのディレクトリは、デフォルトで ~/.local/share/pnpm/store に配置される。
pnpmのワークスペース機能
pnpmは、モノレポ (複数のパッケージを一つのリポジトリで管理する構成) をネイティブにサポートしている。
ワークスペースを使用することで、複数のパッケージ間で依存関係を効率的に管理できる。
ワークスペースを設定するには、プロジェクトのルートディレクトリにpnpm-workspace.yamlファイルを作成する。
# pnpm-workspace.yaml
packages:
- 'packages/*'
- 'apps/*'
- 'tools/*'
この設定により、packages、apps、toolsディレクトリ内の全てのサブディレクトリがワークスペースとして認識される。
ワークスペース内のパッケージに対してコマンドを実行する。
# 特定のワークスペースでコマンドを実行 pnpm --filter <パッケージ名> run build # パターンに一致する全てのワークスペースでコマンドを実行 pnpm --filter "./packages/*" run build # 全てのワークスペースでコマンドを実行 pnpm -r run build # 並列実行 pnpm -r --parallel run build
ワークスペース間の依存関係を追加する。
# パッケージAからパッケージBへの依存を追加 pnpm --filter <パッケージA> add <パッケージB> --workspace
pnpmの高度な機能
pnpmには、プロジェクト管理を効率化するための高度な機能が用意されている。
厳密な依存関係管理
pnpmは、デフォルトで厳密な依存関係管理を行う。
これにより、package.jsonに記述されていないパッケージを使用することができず、ゴーストディペンデンシー (暗黙的な依存関係) の問題を防ぐことができる。
この動作を緩和する必要がある場合は、.npmrcファイルに以下に示す設定を追加する。
# .npmrc
# 厳密なピアディペンデンシーのチェックを無効化
strict-peer-dependencies=false
# ホイスティングを有効化 (互換性のため)
shamefully-hoist=true
パッチ機能
pnpmは、依存パッケージに対してパッチを適用する機能を提供している。
この機能により、上流のパッケージを待たずに、バグ修正や機能追加を行うことができる。
# パッケージのパッチを作成 pnpm patch <パッケージ名>@<バージョン> # パッチディレクトリが表示されるので、必要な変更を加える # 変更後、以下に示すコマンドでパッチをコミットする pnpm patch-commit /path/to/patch/directory
パッチファイルは、patchesディレクトリに保存され、package.jsonのpnpm.patchedDependenciesフィールドに記録される。
カタログ機能
pnpmのカタログ機能を使用することで、ワークスペース全体で依存関係のバージョンを一元管理できる。
pnpm-workspace.yamlファイルにカタログを定義する。
# pnpm-workspace.yaml
packages:
- 'packages/*'
catalog:
react: ^19.0.0
typescript: ^5.0.0
package.jsonファイルでカタログを参照する。
{
"dependencies": {
"react": "catalog:"
},
"devDependencies": {
"typescript": "catalog:"
}
}
パッケージマネージャーの比較
npm
npmは、Node.jsに標準で付属しており、追加のインストールが不要であることがメリットである。
また、最も広く使用されているため、ドキュメントとコミュニティサポートが充実している。
npm 7以降では、パフォーマンスが大幅に改善されており、ワークスペース機能もサポートされている。
Yarn
Yarnは、並列インストールによる高速化と、yarn.lockによる確実な依存関係の固定が特徴である。
Yarn Classicは、安定性と互換性を重視する場合に適している。
Yarn Berryは、Plug'n'Play機能により、高速化とディスク効率の向上が図られている。
ワークスペース機能がネイティブにサポートされており、モノレポ構成に適している。
pnpm
pnpmは、コンテンツアドレサブルストレージとハードリンクを使用することで、ディスク使用量を大幅に削減できる点が最大の特徴である。
また、厳密な依存関係の管理により、ゴーストディペンデンシーの問題を防ぐことができる。
ワークスペース機能も優れており、モノレポ構成の管理が効率的に行える。
一般的に、pnpmが最も高速なインストール速度を提供し、次いでYarn、npmの順となる。
移行時の注意
既存プロジェクトのパッケージマネージャーを変更する場合は、以下に示す事柄に注意する。
- ロックファイルの違い
- npmはpackage-lock.json、Yarnはyarn.lock、pnpmはpnpm-lock.yamlを使用する。
- パッケージマネージャーを変更する場合は、古いロックファイルを削除して、新しいロックファイルを生成する必要がある。
- 統一されたツールを使用すること
- 異なるパッケージマネージャーを混在させると、ロックファイルの不整合が発生する可能性がある。
- プロジェクトのルートディレクトリに、使用するパッケージマネージャーを明記することを推奨する。
- CI/CD環境の設定を更新する
- 各パッケージマネージャーに応じて、インストールコマンドとキャッシュの設定を適切に構成する必要がある。