MSBuild に関する問題のトラブルシューティングとログ記録

以下の手順によって、Visual Studio プロジェクトのビルドに関する問題を診断し、必要に応じて、調査のために Microsoft に送信するログを作成することができます。

プロパティの値が無視される

プロジェクトのプロパティが特定の値に設定されているように見えるのに、ビルドに影響がない場合は、次の手順に従います。

  1. ご自身の Visual Studio のバージョンに対応する Visual Studio 開発者コマンド プロンプトを開きます。

  2. 使用するソリューション パス、構成、プロジェクト名の値を代入した後、次のコマンドを実行します。

    MSBuild /p:SolutionDir="c:\MySolutionDir\";Configuration="MyConfiguration";Platform="Win32" /pp:out.xml MyProject.vcxproj
    

    このコマンドにより、"前処理済み" の MSBuild プロジェクト ファイル (out.xml) が生成されます。 そのファイルから特定のプロパティを検索すれば、それが定義されている場所を確認できます。

プロパティの最後の定義が、ビルドによって使用されます。 プロパティが 2 回設定されている場合は、2 つ目の値により 1 つ目が上書きされます。 また、MSBuild では、いくつかのパスでプロジェクトが評価されます。

  • PropertyGroups と Imports
  • ItemDefinitionGroups
  • ItemGroups
  • Targets

そのため、次の順序を考えてみます。

<PropertyGroup>
   <MyProperty>A</MyProperty>
</PropertyGroup>
<ItemGroup>
   <MyItems Include="MyFile.txt"/>
</ItemGroup>
<ItemDefinitionGroup>
  <MyItems>
      <MyMetadata>$(MyProperty)</MyMetadata>
  </MyItems>
</ItemDefinitionGroup>
<PropertyGroup>
   <MyProperty>B</MyProperty>
</PropertyGroup>

MyFile.txt 項目の MyMetadata の値は、ビルド中に B に評価されます (A ではなく、空でもありません)。

インクリメンタル ビルドで必要以上にビルドされる

MSBuild によってプロジェクトまたはプロジェクト項目が不必要にリビルドされる場合は、詳細またはバイナリ ビルド ログを作成します。 そのログから、不必要にビルドまたはコンパイルされていたファイルを検索できます。 出力は次のようになります。

  Task "CL"

  Using cached input dependency table built from:

  F:\test\Project1\Project1\Debug\Project1.tlog\CL.read.1.tlog

  Outputs for F:\TEST\PROJECT1\PROJECT1\PROJECT1.CPP:
  F:\TEST\PROJECT1\PROJECT1\DEBUG\PROJECT1.OBJ
  Project1.cpp will be compiled because F:\TEST\PROJECT1\PROJECT1\PROJECT1.H was modified at 6/5/2019 12:37:09 PM.

  Outputs for F:\TEST\PROJECT1\PROJECT1\PROJECT1.CPP:
  F:\TEST\PROJECT1\PROJECT1\DEBUG\PROJECT1.OBJ

  Write Tracking Logs:
  Debug\Project1.tlog\CL.write.1.tlog

Visual Studio IDE 内で (詳細な出力ウィンドウを使って) ビルドしている場合、[出力ウィンドウ] に各プロジェクトが最新の状態でない理由が表示されます。

1>------ Up-To-Date check: Project: Project1, Configuration: Debug Win32 ------

1>Project is not up-to-date: build input 'f:\test\project1\project1\project1.h' was modified after the last build finished.

詳細なログを作成する

  1. Visual Studio のメイン メニューから、[ツール]>[オプション]>[プロジェクトおよびソリューション]>[ビルド/実行] に移動します。

  2. [MSBuild プロジェクトのビルドの詳細度] を両方のコンボ ボックスで [詳細] に設定してください。 先頭のものを使うと [出力ウィンドウ] でのビルドの詳細度を制御でき、2 番目のものを使うと、ビルド中に各プロジェクトの中間ディレクトリに作成される {projectname}.log ファイルでのビルドの詳細度を制御できます。

  3. Visual Studio 開発者コマンド プロンプトで、使用する実際のパスと構成値を代入して次のコマンドのいずれかを入力します。

    MSBuild /p:Configuration="MyConfiguration";Platform="x86" /fl MySolution.sln
    

    or

    MSBuild /p:/p:SolutionDir="c:\MySolutionDir\";Configuration="MyConfiguration";Platform="Win32" /fl MyProject.vcxproj
    

    MSBuild を実行したディレクトリに MSBuild.log ファイルが作成されます。

調査のために MSBuild バイナリ ログを提供する

MSBuild には、詳細なバイナリ ログ ファイルをキャプチャする機能があります。 ビルドの問題があり、バイナリ ログを提供できる場合、ログが問題の調査に役立ちます。

ただし、意図した以上の情報を誤って共有しないように、バイナリ ログにキャプチャされる情報の種類に注意する必要があります。 バイナリ ログには、プロジェクト ファイルの内容や、インポートするファイル (.props.targets など)、ビルド中に実行されるすべてのタスク、入力と出力、その MSBuild セッションでアクセスされた環境変数など、ビルドにより実行されるほとんどすべてのものがキャプチャされます。 通常、コンパイルされるソース ファイルの内容は含まれませんが、それらの完全な名前とパスがキャプチャされます。

Note

一部のビルド環境では、環境変数を使用してシークレットを使用できます。 バイナリ ログを共有する前に、API トークンやその他の重要なシークレットが公開されないことをご確認ください。

コマンド ライン ビルドのバイナリ ログをキャプチャする

-bl パラメーターを MSBuild (MSBuild.exe または dotnet build) に渡すと、バイナリ ログを作成できます。 生成された .binlog ファイルの内容は、MSBuild 構造化ログ ビューアー使用するか、ブラウザーで Live 構造化ログ ビューアー を使用して調べることができます。 MSBuild では、ブラウザーで表示されるバイナリ ログからはデータがキャプチャされません。

dotnet build -bl
dotnet build -bl:SpecificStep.binlog
MSBuild.exe -bl:ServiceRelease.binlog -p:Configuration=Release

バイナリ ログの詳細についてもご覧ください。

Visual Studio を使用してバイナリ ログをキャプチャする

すべての MSBuild 呼び出しのログをキャプチャするには、次の手順を行います。

MSBUILDDEBUGENGINE 環境変数を '1' に設定し、(必要に応じて) MSBUILDDEBUGPATH を既存の宛先フォルダーに設定して、キャプチャしたログを格納してください。 次に、同じシェルから Visual Studio を起動して環境を継承してください。

SET MSBUILDDEBUGENGINE=1
SET MSBUILDDEBUGPATH=C:\MSBuildReproLogs
devenv.exe MySolution.sln
$env:MSBUILDDEBUGENGINE = 1
$env:MSBUILDDEBUGPATH="C:\MSBuildReproLogs"
& "devenv.exe" MySolution.sln

MSBuild バイナリ ログは、MSBUILDDEBUGPATH 環境変数を使用して指定された場所 (または、既定では、アクセス権に応じて現在のフォルダーの MSBuild_Logs サブフォルダーか %temp%) にキャプチャされます。

Note

ログは MSBuild 呼び出し (デザイン時ビルドを含む) ごとに記録され、古いものを削除せずにフォルダーに保持されるため、ログ ファイルの数はすぐに増える可能性があります。 調査対象の問題を再現するために、短期間のみオプトイン環境変数を設定することをお勧めします (ただし、一部の非決定的な問題では複数回の再現試行が必要になることがあります)。

Project System Tools 拡張機能を使用し、バイナリ MSBuild ログを作成する

Visual Studio を使用した binlog のキャプチャについては、プロジェクト システム ツール リポジトリのこちらのガイドを参照してください。

  1. Project System Tools 拡張機能をダウンロードし、インストールします。

  2. 拡張機能がインストールされたら、[表示][その他のウィンドウ] メニューに新しい項目がいくつか表示されます。

    Other Windows menu

  3. Visual Studio で [表示][その他のウィンドウ][ビルドのログ] の順に選択し、[ビルドのログ] ウィンドウを表示します。 プロジェクト システムで通常のビルドとデザイン時ビルドの両方のレコーディングを開始するには、最初のツール バー アイコンを選択します。

    Build logging window

  4. ビルドが記録されると、そのビルドが [ビルドのログ] ウィンドウに表示されます。 項目を右クリックし、コンテキスト メニューの [ログの保存] を選択して .binlog ファイルを保存してください。

    Build logging context menu

MSBuild Structured Log Viewer を使用し、.binlog ファイルを表示したり、検索したりできます。