Yarn v1(Yarn Classic)をpnpmに移行する手順
Yarn v1(Yarn Classic)からpnpmに移行する機会がよくあるため手順をまとめました。
※ 執筆時(2024.7)の情報になるため、古くなる可能性があります
パッケージマネージャー設定の変換
以下のコマンドを実行します。
npx @turbo/workspaces convert
これはTurborepoが提供しているパッケージマネージャー変換ツールです。
プロンプトに従って、「pnpm」を選択します。
pnpm-lock.yaml
やpnpm-workspace.yaml
など必要なファイルが作成されます。
シンプルなリポジトリであればこれで完了します。
以下は特別な設定をしている場合の移行と修正になります。
Yarn設定の移行
Yarnの機能(resolutions
など)を使っている場合はpnpm用に置き換えます。
こちらの記事が詳しいです。
設定を変えた場合、pnpm i
で再度ロックファイルを生成します。
依存漏れの修正
pnpmではpackage.jsonのdependencies
, devDependencies
に書かれた直接依存のみnode_modules
直下に展開され解決可能になります。
(依存の依存はnode_modules/.pnpm
に置かれる)
Yarn v1ではたまたま解決できた、というケースがよくあるので、ビルドやtscなどでエラーになった場合は適宜dependencies
, devDependencies
に追記します。
peer依存のオプション
Yarn v1では依存ライブラリに記載されているpeerDependencies
は自動ではインストールしませんが、pnpmはoptionalではないpeerDependencies
を自動でインストールします。[1]
see. https://pnpm.io/ja/npmrc#auto-install-peers
稀ではありますが、古いライブラリだとインストールされる前提ではないpeerDependencies
をoptionalにせずに記載していることがあり、これが不具合を起こすケースがあります。
この場合ライブラリ側を直すのが筋ですが、そもそもこういった記述になっているライブラリは古くメンテナンスされてないケースも多いため、使用する側で対処することも出来ます。
{
"pnpm": {
"packageExtensions": {
"@example/react-utils": {
"peerDependenciesMeta": {
"react": {
"optional": true
}
}
}
}
}
}
see. https://pnpm.io/ja/package_json#pnpmpackageextensions
pnpm移行後のpnpmインストール手順について
変換ツールを使用すると、package.jsonのpackageManager
に使用しているpnpmのバージョンが追記されます。
"packageManager": "pnpm@9.0.0+sha224.953c..(省略)"
see. https://github.com/nodejs/corepack?tab=readme-ov-file#when-authoring-packages
v16.9.0以降のNode.jsを使っていればcorepackがインストールされているため、開発者のローカルマシンやCIでは以下のコマンドを打てば記載されているパッケージマネージャーを使用出来ます。
corepack enable pnpm
pnpm -v
#=> 9.0.0
-
なお、pnpm v7以前はauto-install-peersはデフォルトでfalseなので、自動インストールしません ↩︎
Discussion