Yarn入門:Classic(v1)とBerry(v2+)の違い、Workspaces・PnP・移行時の注意点を徹底解説

Yarnとは

YarnはJavaScript/Node.js向けのパッケージマネージャーで、依存関係のインストール、管理、スクリプト実行を効率的に行うためのツールです。もともとはFacebook(現Meta)を中心に、Exponent(現在のExpo)、Google、Tildeなどの企業やコミュニティの協力で開発され、2016年に発表されました。Yarnの目的は、速度・信頼性・再現性を高め、npm(当時の標準的なパッケージマネージャー)が抱えていた課題(インストールの遅さ、非決定的な依存解決など)を解決することにありました。

Yarnの基本的な特徴

  • 高速なインストール:並列ダウンロードやキャッシュ機構により、同じパッケージを再インストールする際に非常に高速です。
  • ロックファイルによる再現性yarn.lockで依存ツリーを固定し、異なる環境間でも同一の依存構成を再現します。
  • オフラインインストール:一度ダウンロードしたパッケージをキャッシュしておけば、ネットワークのない環境でもインストールできます。
  • Workspaces(モノレポ対応):複数パッケージを一つのリポジトリで管理するモノレポ構成を標準サポートし、依存の共有や効率的なインストールを実現します。
  • セキュリティと整合性チェック:ダウンロード時にチェックサム検証や整合性チェックを行い、改ざんや破損を検出します。

Yarnの進化:Classic(v1)とBerry(v2以降)の違い

Yarnは大きく2つの世代に分かれます。従来のYarn(通称「Classic」またはv1)と、設計を大幅に見直したYarn 2以降(通称「Berry」)です。これらは互換性やアーキテクチャに違いがあるため、導入時はどちらを使うかの選定が重要です。

  • Classic(v1)の特徴
    • node_modulesを使った従来型の依存解決
    • シンプルで多くの既存ツールとの互換性が高い
    • コマンドは「yarn add」「yarn install」など従来型
  • Berry(v2以降)の特徴
    • Plug'n'Play (PnP):デフォルトではnode_modulesを生成せず、依存を直接参照する仕組みで高速化・軽量化を実現(ただし一部ツールとの互換性問題あり)。
    • 設定ファイルの変更.yarnrc.ymlなど新しい設定方式を採用。
    • Zero-Installs:リポジトリにキャッシュを含めることで、初回からインストール不要で即座に環境構築が可能。
    • 新しいプロトコル(workspace:, patch:など)や拡張機能をサポート。

よく使うコマンド(例と用途)

  • yarn init:プロジェクトの初期化(package.jsonの作成)
  • yarn install:依存関係のインストール(yarn.lockに従う)
  • yarn add :依存パッケージを追加(--devでdevDependenciesに)
  • yarn remove :依存パッケージを削除
  • yarn upgrade @:依存のアップデート
  • yarn workspaces:ワークスペース関連の操作(モノレポの管理)
  • yarn dlx :一時的にパッケージを実行(npmのnpxに相当、Berry以降の機能)

モノレポとWorkspaces

Yarn Workspacesは、複数のパッケージ(サブプロジェクト)を単一のリポジトリで管理する場合に非常に便利です。主な利点は以下の通りです。

  • 依存の共通化と重複の排除(インストールが効率化)
  • パッケージ間のローカル参照(workspace:プロトコル)
  • ビルドやテストの横断的な自動化が容易になる

一方で、構成が複雑になりやすく、Workspacesと他のツール(CIやIDE、サードパーティツール)との互換性チェックが必要です。

セキュリティと再現性

Yarnはロックファイル(yarn.lock)により同一の依存ツリーを再現する仕組みを提供します。これにより、開発者間やCI環境での「ローカルでは動くがCIで動かない」といった問題を低減できます。また、ダウンロード時のチェックサムや整合性検証を行うことでパッケージの改ざんを検出する機能があり、セキュリティ面でも有利です。

npmやpnpmとの比較

Yarn登場当初はnpmに対して明確に速度や決定性で優位性がありましたが、その後npm自身も改善(package-lock.jsonの導入、並列化、Workspacesのサポートなど)しており、現在は機能が近づいています。pnpmは別のアプローチで、コンテンツアドレッシングされたグローバルストアとハードリンク/シンボリックリンクを使い、ディスク使用量とインストール速度の点で利点があります。

  • Yarn(特にBerry):PnPによるnode_modules不要化、Zero-Installs、強力なワークスペース管理。
  • npm:エコシステムのデフォルト、広い互換性、近年の機能強化で実用性向上。
  • pnpm:効率的なディスク利用と速いインストール、大規模モノレポでの利点。

導入・移行時の注意点

Yarnを導入・移行する際には以下の点に注意してください。

  • ロックファイルの扱い:npmから移行する場合はyarn importでpackage-lock.jsonからyarn.lockを生成できますが、内容の確認とテストは必須です。
  • PnPの互換性:Yarn BerryのPnPは一部のライブラリやビルドツールが期待するnode_modulesを前提としていないため、互換性問題が発生することがあります。その場合はnodeLinker: "node-modules"設定で従来方式に戻せます。
  • CIやIDEの対応:CI設定やIDE(VSCodeなど)のプラグインがYarn Berryの独自機能に対応しているかを確認してください。YarnはIDE向けのSDK生成機能も提供していますが、環境によって手順が必要です。
  • チーム合意:異なるマシンやCIで同じ振る舞いを得るため、プロジェクトで使用するYarnのバージョン(Classic vs Berry)や設定を統一し、リポジトリにバージョンを含める運用(例:yarn set version)が推奨されます。

実務での運用ポイントとベストプラクティス

  • ロックファイルは常にコミットして依存の再現性を担保する。
  • CIではキャッシュ機構を適切に使い、インストール速度を改善する(例:YarnのキャッシュディレクトリやBerryのZero-Installs)。
  • モノレポを採用する場合はWorkspacesを活用しつつ、依存ポリシー(shared dependencyのバージョン管理など)を明確化する。
  • Berryを導入する場合は、事前に主要な開発ツールやビルドフローとの互換性確認・テストを行う。
  • セキュリティ面では定期的な依存更新と監査(yarn auditなど)を実施する。

まとめ

YarnはJavaScriptエコシステムにおける主要なパッケージマネージャーの一つで、速度・信頼性・モノレポ対応といった点で強力な機能を提供します。Classic(v1)は既存ツールとの互換性が高く、Berry(v2以降)はPlug'n'PlayやZero-Installsなど新しい概念を導入しており、用途やプロジェクト特性に応じて選択することが重要です。移行時は互換性やCI/IDE対応を事前に確認し、ロックファイル運用やチーム内合意を徹底することで安定した開発環境を実現できます。

参考文献