共用方式為


針對 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)。 您可以在該檔案中搜尋特定屬性,以查看其定義位置。

屬性的最後一個定義是組建所取用的內容。 如果屬性設定兩次,第二個值會覆寫第一個值。 此外,MSBuild 會以數個階段評估專案:

  • PropertyGroups 和匯入
  • 項目定義群組
  • 項目組
  • Targets

因此,給定以下順序:

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

項目的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. 開啟 [工具>選項] 窗格,然後展開 [所有設定>專案和解決方案>建置和執行] 區段。
  1. 開啟 [工具>選項] 對話方塊,然後展開 [專案和解決方案>建置和執行 ] 區段。
  1. 使用下拉式清單,並將 MSBuild 專案建置輸出詳細程度MSBuild 專案建置記錄檔詳細程度選項設定為 [詳細]。

    第一個控制輸出視窗中的組建詳細程度,第二個則控制在建置期間於每個專案的中繼目錄中建立的檔案內的組建詳細程度。

  2. 從 Visual Studio 開發人員命令提示字元中,輸入下列其中一個命令,取代您的實際路徑和設定值:

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

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

    MSBuild.log檔案會在您執行 MSBuild 的目錄中建立。

提供 MSBuild 二進位記錄以進行調查

MSBuild 能夠擷取詳細的二進位記錄檔。 如果您遇到組建問題,而且能夠提供二進位記錄,記錄檔有助於調查問題。

不過,您應該注意二進位記錄檔中擷取的資訊類型,以確保您不會無意中共用超出預期的內容。 二進位記錄幾乎會擷取組建執行的所有動作,包括專案檔的內容,以及它們匯入的任何檔案 (,例如 .props.targets)、組建期間執行的所有工作,以及輸入和輸出,以及已在該 MSBuild 會話中存取的環境變數。 它通常不包含編譯的源文件的內容,但它確實捕獲了它們的完整名稱和路徑。

備註

某些建置環境會使用環境變數來提供秘密。 在分享二進位記錄之前,請確認它不會曝光 API 權杖或其他重要的機密資訊。

擷取命令列組建的二進位記錄

您可以將參數傳遞 -bl 至 MSBuild (MSBuild.exedotnet build) 來建立二進位記錄。 您可以使用 .binlog,或使用即時結構化記錄檢視器在瀏覽器中探索所產生檔案的內容。 MSBuild 不會從瀏覽器上檢視的二進位記錄擷取任何資料。

範例

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

另請參閱 二進位日誌的更多詳細資訊

透過 Visual Studio 擷取二進位記錄

若要擷取所有 MSBuild 調用的記錄:

將環境變數設定 MSBUILDDEBUGENGINE'1' 和 (選擇性地) 設定 MSBUILDDEBUGPATH 為現有的目的地資料夾,以儲存擷取的記錄。 然後從相同的 shell 啟動 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%

備註

記錄會針對每個 MSBuild 調用 (包括設計階段組建) 記錄,並保留在資料夾中,而不會移除較舊的記錄檔,因此記錄檔數目可以快速成長。 建議僅在重現需要調查的問題的短時間內設定選擇加入的環境變數(儘管某些不確定性問題可能需要多次重現嘗試,這是可以理解的)。

使用 Project System Tools 延伸模組建立二進位 MSBuild 記錄

請參閱 Project System Tools 存放庫中的 本指南 ,以透過 Visual Studio 擷取 binlog。

  1. 下載並安裝 Project System Tools 延伸模組

  2. 安裝擴充功能後,一些新項目會出現在 「檢視>其他視窗 」選單中。

    其他 Windows 功能表

  3. 選取 [檢視]>[其他 Windows]>[組建記錄] ,以在 Visual Studio 中顯示 [組建記錄] 視窗。 選擇第一個工具列圖示,開始在專案系統中記錄一般和設計階段的建置。

    建置記錄視窗

  4. 記錄組建之後,它會出現在「組建記錄」視窗中。 以滑鼠右鍵按一下該項目,然後在內容功能表上選擇「 儲存日誌」 以儲存檔案 .binlog

    建置記錄內容功能表

您可以使用 MSBuild 結構化記錄檢視器來檢視和搜尋 .binlog 檔案。