[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.ymlsupportedArchitectures を追加

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

ポイントはcpux64arm64を明示すること。 これで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.ymlsupportedArchitectures設定 + yarn install
  • 最終的に@next/swc-darwin-arm64@next/swc-darwin-x64が展開されていれば再発しない。