できない.dev

C# で「A compatible .NET SDK was not found」が出てビルドできない

global.json が要求する SDK バージョンが端末に入っておらず、ロールフォワードでも届かないときに出る。
インストール済みの SDK を確認し、global.json の version か rollForward を実態に合わせる。

公開:

要約

dotnet は SDK コマンドを実行する前に、カレントディレクトリから上へ global.json を探し、そこに書かれたバージョンで SDK を選ぶ。
要求に合う SDK が無ければ、ビルド以前にコマンドの読み込み自体が止まる。

A compatible .NET SDK was not found.
 
Requested SDK version: 8.0.100
global.json file: C:\src\app\global.json
 
Install the [8.0.100] .NET SDK or update [C:\src\app\global.json] to match an installed SDK.

メッセージが要求バージョンと global.json の場所を両方出しているので、まずその 2 つと dotnet --list-sdks の出力を突き合わせる。

よくある原因

  1. 要求バージョンが端末に無い: 8.0.100 を指定した状態で 9.0.30510.0.400 しか入っていない、という食い違いが最も多い。
  2. ロールフォワードの既定が狭い: rollForward を省略すると既定は latestPatch で、global.json overview(新しいタブで開く) が説明するとおり同じ機能バンド(8.0.1xx)のパッチにしか上がらない。
    メジャーや機能バンドをまたぐ更新では届かない。
  3. CI イメージ側の入れ替わり: ホストされた runner の SDK は定期的に更新される。
    ピン留めしたバージョンがイメージから消えると、ある日突然この状態になる。
  4. 上位ディレクトリの global.json: 探索はカレントから上へ遡るため、モノレポのルートやホームディレクトリに置き忘れた 1 個が全プロジェクトに効いてしまう。
  5. SDK ではなくランタイムだけ入れた: 実行だけなら足りるが、dotnet build には SDK が要る。dotnet --list-sdks が空なら入れ直す。

解決策

1. 入っている SDK を確認する

dotnet --list-sdks
9.0.305 [C:\Program Files\dotnet\sdk]
10.0.400 [C:\Program Files\dotnet\sdk]

この一覧に無いバージョンを global.json が求めているなら、以降のどれかで揃える。

2. バージョンを実態に合わせる

{
  "sdk": {
    "version": "10.0.400"
  }
}

チーム全員が同じ SDK を使う前提なら、これが最も意図の伝わる書き方になる。

3. ロールフォワードを緩める

{
  "sdk": {
    "version": "9.0.100",
    "rollForward": "latestFeature"
  }
}

latestFeature は同じメジャー内で機能バンドを上げ、latestMajor はメジャーもまたぐ。
上の指定は 9.0.100 が無くても 9.0.305 を選ぶ。
新しい SDK を許容できるかはプロジェクト次第なので、緩めた分は CI で検証する。

4. 生成し直す

dotnet new globaljson --sdk-version 10.0.400 --force

手書きで綴りを間違えるより確実である。--force は既存ファイルの上書きを許可する。

5. 効いている global.json を特定する

エラーに出る global.json file: のパスが、自分が編集したファイルと一致しているかを必ず見る。
一致していなければ、上位ディレクトリの一個が優先されている。

この記事は役立ちましたか?