[Next.js] dev起動でFailed to get registry from "yarn" が出たときの対処(Yarn 4)
Next.jsの開発サーバー起動時に、次のエラーで停止した。
[dev] ✓ Starting...
[dev] Downloading swc package @next/swc-darwin-arm64... to ~/Library/Caches/next-swc
[dev] Unhandled Rejection: Error: Failed to get registry from "yarn".
[dev] at ignore-listed frames {
[dev] [cause]: Error: Command failed: yarn config get registry
...何が起きていたか
今回のプロジェクトはyarn@4を使用している。
"packageManager": "yarn@4.10.3"SWCはNext.jsが内部で使うコンパイラで、@next/swc-darwin-arm64などはその環境別バイナリにあたる。
Next.js側はSWCダウンロード時に内部で次のコマンドを実行する。
yarn config get registryしかしYarn 4にはregistryという設定名が存在しないため、コマンドが必ず失敗する。
Usage Error: Couldn't find a configuration settings named "registry"この失敗をNext.jsが例外として扱い、Failed to get registry from "yarn"で起動が止まっていた。
今回の対処方針
Next.js側のregistry参照ロジックはこちらでは制御できないため、
SWCを起動前にnode_modulesへ展開して、ダウンロード経路に入らないようにする方針を採用した。
実施した修正
1. .yarnrc.yml に supportedArchitectures を追加
supportedArchitecturesはYarn 4の設定で、インストール時にどのアーキテクチャ(OS・CPUタイプ)向けのパッケージを取得するかを指定できる。デフォルトでは実行中のマシンに合ったものだけが対象だが、ここで明示すると、普段は必要なときだけ入るoptional dependencies(任意の依存関係)も強制的にインストールされるようになる。
enableGlobalCache: false
nodeLinker: node-modules
supportedArchitectures:
os:
- current
cpu:
- current
- x64
- arm64
libc:
- current
yarnPath: .yarn/releases/yarn-4.10.3.cjsポイントはcpuにx64とarm64を明示すること。
これでYarnが両アーキテクチャのSWCバイナリをインストール対象に含められるようになる。
2. 依存関係を再解決
yarn(yarn install でも同等に動作する。)
3. SWCが展開されたことを確認
ls -1 node_modules/@next | grep "swc-darwin"期待する出力:
swc-darwin-arm64
swc-darwin-x64なぜこれで解決するのか
エラーの本質は「レジストリ取得の失敗」ではなく、 SWCが未配置のために発生する追加ダウンロード処理で顕在化したものだった。
必要なSWCが最初からnode_modulesに存在すれば、
問題のyarn config get registry実行箇所を実質的に回避できる。
まとめ
- 原因は Next.js側の
yarn config get registry呼び出し と Yarn 4の設定仕様差分 。 - 回避策は
.yarnrc.ymlのsupportedArchitectures設定 +yarn install。 - 最終的に
@next/swc-darwin-arm64と@next/swc-darwin-x64が展開されていれば再発しない。