Memecahkan masalah dan membuat log untuk masalah MSBuild
Prosedur berikut dapat membantu Anda mendiagnosis masalah build di proyek Visual Studio Anda, dan, jika perlu, membuat log untuk dikirim ke Microsoft untuk penyelidikan.
Nilai properti diabaikan
Jika properti proyek tampaknya diatur ke nilai tertentu, tetapi tidak berpengaruh pada build, ikuti langkah-langkah berikut:
Buka Perintah Pengembang Visual Studio yang sesuai dengan versi Visual Studio Anda.
Jalankan perintah berikut, setelah mengganti nilai untuk jalur solusi, konfigurasi, dan nama proyek Anda:
MSBuild /p:SolutionDir="c:\MySolutionDir\";Configuration="MyConfiguration";Platform="Win32" /pp:out.xml MyProject.vcxproj
Perintah ini menghasilkan file proyek MSBuild "preprocessed" (out.xml). Anda dapat mencari file tersebut untuk properti tertentu untuk melihat di mana properti tersebut ditentukan.
Definisi terakhir dari properti adalah apa yang digunakan build. Jika properti diatur dua kali, nilai kedua akan menimpa yang pertama. Selain itu, MSBuild mengevaluasi proyek dalam beberapa pass:
- PropertyGroups dan Imports
- ItemDefinitionGroups
- Grup Item
- Target
Oleh karena itu, diberikan urutan berikut:
<PropertyGroup>
<MyProperty>A</MyProperty>
</PropertyGroup>
<ItemGroup>
<MyItems Include="MyFile.txt"/>
</ItemGroup>
<ItemDefinitionGroup>
<MyItems>
<MyMetadata>$(MyProperty)</MyMetadata>
</MyItems>
</ItemDefinitionGroup>
<PropertyGroup>
<MyProperty>B</MyProperty>
</PropertyGroup>
Nilai MyMetadata
untuk MyFile.txt
item dievaluasi selama B
build (tidak dan tidak A
kosong).
Build inkremental membangun lebih dari yang seharusnya
Jika MSBuild tidak perlu membangun ulang item proyek atau proyek, buat log build terperinci atau biner. Anda dapat mencari log untuk file yang dibuat atau dikompilasi secara tidak perlu. Output terlihat seperti ini:
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
Jika Anda membangun di Visual Studio IDE (dengan verbositas jendela output terperinci), Jendela Output menampilkan alasan mengapa setiap proyek tidak diperbarui:
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.
Membuat log terperinci
Dari menu utama Visual Studio, buka Proyek Opsi>Alat>dan Build dan Jalankan Solusi.>
Atur verbositas build proyek MSBuild ke Terperinci di kedua kotak kombo. Kontrol teratas membangun verbositas di Jendela Output dan kontrol kedua mengontrol membangun verbositas dalam
{projectname}.log
file yang dibuat di direktori perantara setiap proyek selama build.Dari perintah pengembang Visual Studio, masukkan salah satu perintah ini, ganti jalur aktual dan nilai konfigurasi Anda:
MSBuild /p:Configuration="MyConfiguration";Platform="x86" /fl MySolution.sln
or
MSBuild /p:/p:SolutionDir="c:\MySolutionDir\";Configuration="MyConfiguration";Platform="Win32" /fl MyProject.vcxproj
File
MSBuild.log
dibuat di direktori tempat Anda menjalankan MSBuild.
Menyediakan log biner MSBuild untuk penyelidikan
MSBuild memiliki kemampuan untuk mengambil file log biner terperinci. Jika Anda mengalami masalah build dan dapat memberikan log biner, log dapat membantu untuk menyelidiki masalah tersebut.
Namun, Anda harus mengetahui jenis informasi apa yang diambil dalam log biner untuk memastikan Anda tidak secara tidak sengaja berbagi lebih dari yang Anda inginkan. Log biner menangkap hampir semua yang dilakukan build Anda, termasuk konten file proyek Anda dan file apa pun (seperti .props
dan .targets
) yang mereka impor, semua tugas yang dijalankan selama build serta input dan output, serta variabel lingkungan yang telah diakses dalam sesi MSBuild tersebut. Umumnya tidak menyertakan konten file sumber yang dikompilasi, tetapi memang menangkap nama lengkap dan jalurnya.
Catatan
Beberapa lingkungan build membuat rahasia tersedia menggunakan variabel lingkungan. Sebelum berbagi log biner, pastikan log tidak mengekspos token API atau rahasia penting lainnya.
Mengambil log biner untuk build baris perintah
Anda dapat membuat log biner dengan meneruskan -bl
parameter ke MSBuild (MSBuild.exe
atau dotnet build
). Anda dapat menjelajahi konten file yang dihasilkan .binlog
menggunakan MSBuild Structured Log Viewer atau di browser Anda menggunakan Penampil Log Terstruktur Langsung. MSBuild tidak mengambil data apa pun dari log biner yang dilihat di browser Anda.
Contoh
dotnet build -bl
dotnet build -bl:SpecificStep.binlog
MSBuild.exe -bl:ServiceRelease.binlog -p:Configuration=Release
Lihat juga Detail selengkapnya tentang log biner.
Mengambil log biner melalui Visual Studio
Untuk mengambil log untuk semua pemanggilan MSBuild:
Atur MSBUILDDEBUGENGINE
variabel lingkungan ke '1'
dan (opsional) diatur MSBUILDDEBUGPATH
ke folder tujuan yang ada untuk menyimpan log yang diambil. Kemudian mulai Visual Studio dari shell yang sama untuk mewarisi lingkungan:
SET MSBUILDDEBUGENGINE=1
SET MSBUILDDEBUGPATH=C:\MSBuildReproLogs
devenv.exe MySolution.sln
$env:MSBUILDDEBUGENGINE = 1
$env:MSBUILDDEBUGPATH="C:\MSBuildReproLogs"
& "devenv.exe" MySolution.sln
Log biner MSBuild kemudian diambil ke lokasi yang ditentukan melalui MSBUILDDEBUGPATH
variabel lingkungan (atau default ke MSBuild_Logs
subfolder folder saat ini atau %temp%
, berdasarkan hak akses).
Catatan
Log direkam untuk setiap pemanggilan MSBuild (termasuk build waktu desain) dan disimpan di folder tanpa menghapus yang lebih lama - sehingga jumlah file log dapat tumbuh dengan cepat. Disarankan untuk mengatur variabel lingkungan keikutsertaan hanya untuk durasi singkat mereproduksi masalah yang akan diselidiki (meskipun dapat dimengerti bahwa beberapa masalah nondeterministik mungkin memerlukan beberapa upaya reproduksi).
Membuat log MSBuild biner dengan menggunakan ekstensi Alat Sistem Proyek
Lihat panduan ini di repositori Alat Sistem Proyek untuk menangkap binlog melalui Visual Studio.
Unduh dan instal ekstensi Alat Sistem Proyek.
Setelah ekstensi diinstal, beberapa item baru muncul di menu Tampilkan>Windows Lainnya.
Pilih Tampilkan>Pengelogan Build Windows>Lainnya untuk menampilkan jendela Pembuatan Log di Visual Studio. Pilih ikon toolbar pertama untuk mulai merekam build reguler dan waktu desain dalam sistem proyek.
Setelah build direkam, build akan muncul di jendela Pembuatan Log Build. Klik kanan item dan pilih Simpan Log pada menu konteks untuk menyimpan file Anda
.binlog
.
Anda dapat melihat dan mencari file .binlog dengan menggunakan MSBuild Structured Log Viewer.