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 の出力を突き合わせる。
よくある原因
- 要求バージョンが端末に無い:
8.0.100を指定した状態で9.0.305と10.0.400しか入っていない、という食い違いが最も多い。 - ロールフォワードの既定が狭い:
rollForwardを省略すると既定はlatestPatchで、global.json overview(新しいタブで開く) が説明するとおり同じ機能バンド(8.0.1xx)のパッチにしか上がらない。
メジャーや機能バンドをまたぐ更新では届かない。 - CI イメージ側の入れ替わり: ホストされた runner の SDK は定期的に更新される。
ピン留めしたバージョンがイメージから消えると、ある日突然この状態になる。 - 上位ディレクトリの
global.json: 探索はカレントから上へ遡るため、モノレポのルートやホームディレクトリに置き忘れた 1 個が全プロジェクトに効いてしまう。 - SDK ではなくランタイムだけ入れた: 実行だけなら足りるが、
dotnet buildには SDK が要る。dotnet --list-sdksが空なら入れ直す。
解決策
1. 入っている SDK を確認する
dotnet --list-sdks9.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: のパスが、自分が編集したファイルと一致しているかを必ず見る。
一致していなければ、上位ディレクトリの一個が優先されている。