MS_NuGetMSB4036 - NetDevInfraWGinOSSConsortium/NetDevInfraWiki GitHub Wiki
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.BuildToolsNuGet パッケージ マネージャー Microsoft.VisualStudio.Component.NuGetCI のイメージを構築する場合は、
この 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 ReleaseSDK スタイルに移行済みなら、
dotnet buildに切り替えるのが
最も確実な回避策である
(dotnetコマンド)。
packages.config形式が残っていてMSBuild.exeが必要な場合に限り、
上記のコンポーネント追加が要る。
- MsBuild broken - "GetReferenceNearestTargetFrameworkTask" task was not found - Developer Community
https://developercommunity.visualstudio.com/content/problem/160494/msbuild-broken-getreferencenearesttargetframeworkt.html
- Visual Studio Build Tools のワークロードとコンポーネント ID
https://learn.microsoft.com/ja-jp/visualstudio/install/workload-component-id-vs-build-tools - MSBuild エラー MSB4036
https://learn.microsoft.com/ja-jp/visualstudio/msbuild/errors/msb4036
Tags: 移行, .NET開発, デプロイ, デバッグ, NuGet