MS_NuGetMSB4036 - NetDevInfraWGinOSSConsortium/NetDevInfraWiki GitHub Wiki

Nuget使用時に「error MSB4036 'GetReferenceNearestTargetFrameworkTask' task was not found.」が発生

概要

Visual Studio Build Tools の個別のコンポーネントのインストールが必要らしい。

補足(エラーの意味): GetReferenceNearestTargetFrameworkTask は、
プロジェクト参照の際に「最も近いターゲット フレームワークを選ぶ」
ための MSBuild タスクである。

参照する側:net48
参照される側:<TargetFrameworks>netstandard2.0;net8.0</TargetFrameworks>
      ↓
このタスクが「net48 から使うなら netstandard2.0」と判定する

このタスクは NuGet の MSBuild 統合
NuGet.Build.Tasks.dll)が提供しているため、
NuGet のビルド タスクが入っていないと見つからない

つまり、「複数ターゲットのプロジェクトを参照した瞬間に出る」
のがこのエラーの特徴で、
ターゲット フレームワークのバージョン で述べた
複数ターゲット化を始めた時に踏みやすい。

詳細

以下で解決できる。

  • Visual Studio Installer を起動

  • Visual Studio Build Tools を選択
    各エディションの方からやった場合、解決しなかった。

  • 変更ボタンを押下

  • 個別のコンポーネント・タブ

    • コード ツール
      • NuGet のターゲットおよびビルド タスク
      • NuGet パッケージ マネージャー
  • 変更ボタンを押下

補足(「各エディションの方からやった場合、解決しなかった」): 原文の
この観測は重要で、原因は MSBuild の実体が複数あることにある。

C:\Program Files\Microsoft Visual Studio\2022\
    Community\MSBuild\Current\Bin\MSBuild.exe      ← IDE 用
    BuildTools\MSBuild\Current\Bin\MSBuild.exe     ← Build Tools 用(別物)

CI やコマンド ラインでビルドしている場合、
使われているのは Build Tools 側
であることが多い。
IDE(Community / Professional)側にコンポーネントを追加しても、
Build Tools 側には反映されない——というのが原文の遭遇した状況である。

どの MSBuild が使われているかを確認するのが先決。

# インストール済みの VS / Build Tools を列挙する
& "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe" `
    -all -products * -format value -property installationPath

# 実際に使われる MSBuild のパス
& "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe" `
    -latest -requires Microsoft.Component.MSBuild `
    -find MSBuild\**\Bin\MSBuild.exe

vswhere.exe については MSBuild を参照。

補足(コンポーネント ID で入れる): GUI ではなく
コマンド ラインで追加する場合は、次の ID を使う。

vs_buildtools.exe --quiet --wait --norestart `
  --add Microsoft.VisualStudio.Workload.MSBuildTools `
  --add Microsoft.VisualStudio.Component.NuGet.BuildTools
表示名 コンポーネント ID
NuGet のターゲットおよびビルド タスク Microsoft.VisualStudio.Component.NuGet.BuildTools
NuGet パッケージ マネージャー Microsoft.VisualStudio.Component.NuGet

CI のイメージを構築する場合は、
この 2 つを明示的に含めておくとこのエラーを予防できる。

補足(dotnet build なら発生しない/最新化): この問題は
MSBuild.exe(Visual Studio 側)を使う場合に限られる

ビルド方法 NuGet ビルド タスク
MSBuild.exe(VS / Build Tools) 別途インストールが必要
dotnet build / dotnet msbuild .NET SDK に同梱(常に入っている)
# .NET SDK さえあれば動く
dotnet build Foo.sln -c Release

SDK スタイルに移行済みなら、dotnet build に切り替えるのが
最も確実な回避策
である
dotnetコマンド)。
packages.config 形式が残っていて MSBuild.exe が必要な場合に限り、
上記のコンポーネント追加が要る。

参考

Microsoft Learn


Tags: 移行, .NET開発, デプロイ, デバッグ, NuGet

⚠️ **GitHub.com Fallback** ⚠️