できない.dev

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

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

公開: 更新:

症状できない · exit 145
dotnet build
…
      A compatible .NET SDK was not found.
Requested SDK version: 8.0.100
global.json file: /tmp/tmp.2XcTFfjZJB/app/global.json
解決後できた · exit 0
dotnet build
…
    0 Warning(s)
    0 Error(s)
Time Elapsed 00:00:01.74

2026-09-26 に mcr.microsoft.com/dotnet/sdk:8.0(Git 2.39.5) で実際に打って取った出力。検証環境の詳細

要約

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 の出力を突き合わせる。

実行例

SDK 8.0.425 だけが入った mcr.microsoft.com/dotnet/sdk:8.0 で global.json に 8.0.100 を指定すると、dotnet build は「A compatible .NET SDK was not found」で終了コード 145 になり、rollForward に latestFeature を足した global.json ではビルドが通った。rollForward なしの 8.0.100 指定に戻したディレクトリでは dotnet new globaljson --force も同じエラーで止まり、親ディレクトリから -o app で 8.0.425 の global.json を生成し直すとビルドが成功している。

$ dotnet build
The command could not be loaded, possibly because:
  * You intended to execute a .NET application:
      The application 'build' does not exist.
  * You intended to execute a .NET SDK command:
      A compatible .NET SDK was not found.
 
Requested SDK version: 8.0.100
global.json file: /tmp/tmp.2XcTFfjZJB/app/global.json
 
Installed SDKs:
 
Install the [8.0.100] .NET SDK or update [/tmp/tmp.2XcTFfjZJB/app/global.json] to match an installed SDK.
 
Learn about SDK resolution:
https://aka.ms/dotnet/sdk-not-found
8.0.425 [/usr/share/dotnet/sdk]
$ echo $?
145
$ dotnet --list-sdks
8.0.425 [/usr/share/dotnet/sdk]
$ cat global.json
{
  "sdk": {
    "version": "8.0.100",
    "rollForward": "latestFeature"
  }
}
$ dotnet build
Determining projects to restore...
  All projects are up-to-date for restore.
  app -> /tmp/tmp.2XcTFfjZJB/app/bin/Debug/net8.0/app.dll
 
Build succeeded.
    0 Warning(s)
    0 Error(s)
 
Time Elapsed 00:00:01.74
$ echo $?
0
$ cat global.json
{
  "sdk": {
    "version": "8.0.100"
  }
}
$ dotnet new globaljson --sdk-version 8.0.425 --force
The command could not be loaded, possibly because:
  * You intended to execute a .NET application:
      The application 'new' does not exist.
  * You intended to execute a .NET SDK command:
      A compatible .NET SDK was not found.
 
Requested SDK version: 8.0.100
global.json file: /tmp/tmp.2XcTFfjZJB/app/global.json
 
Installed SDKs:
 
Install the [8.0.100] .NET SDK or update [/tmp/tmp.2XcTFfjZJB/app/global.json] to match an installed SDK.
 
Learn about SDK resolution:
https://aka.ms/dotnet/sdk-not-found
8.0.425 [/usr/share/dotnet/sdk]
$ echo $?
145
$ dotnet new globaljson --sdk-version 8.0.425 --force -o app
The template "global.json file" was created successfully.
$ cat global.json
{
  "sdk": {
    "version": "8.0.425"
  }
}
$ dotnet build
Determining projects to restore...
  All projects are up-to-date for restore.
  app -> /tmp/tmp.2XcTFfjZJB/app/bin/Debug/net8.0/app.dll
 
Build succeeded.
    0 Warning(s)
    0 Error(s)
 
Time Elapsed 00:00:00.68
$ echo $?
0

— 2026-09-26 時点の出力

検証環境Git 2.39.5 / 2026-09-26 検証
検証日
実行環境
mcr.microsoft.com/dotnet/sdk:8.0 Debian GNU/Linux 12 (bookworm)
バージョン
  • Git 2.39.5

この記事の「実行例」は、上記の環境で実際にコマンドを実行して得られた出力をそのまま掲載しています。 再現手順はリポジトリの検証スクリプトとして管理し、定期的に再実行して出力を更新しています。

解決策

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. 生成し直す

rm global.json
dotnet new globaljson --sdk-version 10.0.400

手書きで綴りを間違えるより確実である。
ただし dotnet new も SDK のコマンドなので、入っていないバージョンを要求する global.json があるディレクトリで実行すると、同じ「A compatible .NET SDK was not found」で止まる。--force(既存ファイルの上書き許可)を付けても変わらないため、先にファイルを削除する。
削除したくない場合は、親ディレクトリから出力先を指定して上書きする(dotnet new globaljson --sdk-version 10.0.400 --force -o app)。

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

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

よくある原因

  1. 要求バージョンが端末に無い: 8.0.100 を指定した状態で 9.0.305 と 10.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 が空なら入れ直す。

この手順で直った?