msbuild.exe tetap terbuka, mengunci file

98

Saya menggunakan TeamCity yang pada gilirannya memanggil msbuild (.NET 4). Saya memiliki masalah aneh karena setelah build selesai (dan tampaknya tidak masalah apakah build berhasil atau tidak), msbuild.exe tetap terbuka, dan mengunci salah satu file, yang berarti setiap kali TeamCity mencoba untuk menghapus direktori kerjanya, gagal, dan tidak dapat melanjutkan.

Ini terjadi hampir setiap saat.

Saya benar-benar kehilangan yang satu ini, jadi saya akan mencoba memberikan sedetail mungkin.

  • Server adalah Intel Core i7, RAM 2 GB, dengan standar Windows Server 2008 64-bit SP2.
  • Di TeamCity, runner msbuild dikonfigurasi dengan /mparameter baris perintah (yang berarti menggunakan banyak inti)
  • File yang dimaksud SELALU DLL eksternal yang sama yang direferensikan di salah satu proyek .NET, di jalur External Tools\Telerik\Telerik.Reporting.Dll. (Ada beberapa file .DLL lain yang disertakan dalam External Toolsdir dalam struktur jalur serupa yang tidak pernah menyebabkan masalah ini). Saat ini ini adalah dengan versi percobaan dari laporan Telerik, jika ada perbedaan.
  • Ketika masalah terjadi, selalu ada beberapa msbuild.exe *32proses yang terdaftar di Task manager: Saya yakin ada 7. Menggunakan Process Explorer, semuanya terlihat seperti proses tingkat atas (tidak ada orang tua). Mereka semua menggunakan ram 20-50MB, dan CPU 0,0%.
  • Jika saya menunggu 1-3 menit, proses msbuild.exe keluar dengan sendirinya, dan TeamCity kemudian dapat memperbarui direktori kerja dengan benar.
  • Jika saya menghentikan proses msbuild secara manual, pembaruan TeamCity akan segera berfungsi kembali.
  • Layanan pengindeksan dimatikan di Windows (meskipun dua poin sebelumnya cukup banyak mengkonfirmasi bahwa msbuild.exe yang menyebabkan masalah).
  • Tidak ada properti khusus di Telerik.reporting.dll. Satu-satunya properti SVN adalahsvn:mime-type = application/octet-stream

Adakah yang pernah mengalami ini sebelumnya?

gregmac
sumber

Jawaban:

123

Gunakan msbuilddengan /nr:false.

Singkatnya: MSBuild mencoba melakukan banyak hal untuk menjadi cepat, terutama dengan build paralel. Ini akan menelurkan banyak "node" - proses msbuild.exe individu yang dapat mengkompilasi proyek, dan karena proses membutuhkan sedikit waktu untuk berputar, setelah build selesai, proses ini bertahan (secara default, selama 15 menit, menurut saya ), sehingga jika Anda segera membuat lagi, node ini dapat "digunakan kembali" dan menghemat biaya penyiapan proses. Tetapi Anda dapat menonaktifkan perilaku itu dengan mematikan nodeReuse dengan opsi baris perintah yang disebutkan di atas.

Lihat juga:

Brian
sumber
2
Masuk akal: sepertinya tidak akan terjadi jika saya menghapus / m. Saya mencoba sekarang dengan /m /nr:false, saya akan menjalankan beberapa build dan melihat bagaimana kelanjutannya. Terima kasih
gregmac
26
Bagaimana Anda mendapatkan Visual Studio untuk membangun proyek dengan opsi msbuild itu?
Cameron Taggart
1
Saya masih ingin tahu, tetapi saya benar-benar mengalami bug Visual Studio 11 Beta untuk proyek C ++ / CLI. Apakah menyebabkan gejala yang sama: connect.microsoft.com/VisualStudio/feedback/details/728912/…
Cameron Taggart
3
Optimalisasi dini benar-benar merupakan akar dari segala kejahatan. Anda payah, Microsoft.
johnwbyrd
1
@CameronTaggart Anda dapat menambahkan opsi baris perintah msbuild dengan file khusus yang dihosting di folder proyek / solusi Anda. Lihat docs.microsoft.com/en-us/visualstudio/msbuild/…
needfulthing
43

Untuk menonaktifkan node reuse dalam Visual Studio, Anda harus menggunakan variabel lingkungan:

MSBUILDDISABLENODEREUSE=1
dan
sumber
Saya menggunakan ini secara efektif, namun ada alat lain yang gagal sekarang, ketika mengkompilasi C ++ dengan VS11 Beta, yaitu mt.exe, apakah ada variabel lain yang digunakan untuk itu?
Eugenio Miró
Tidak bisakah itu diatur menggunakan kotak dialog di suatu tempat di VS?
dom_beau
1
@dan Terima kasih yang tulus telah menemukan yang ini, dan saya berdoa ada variabel lingkungan untuk menonaktifkan Microsoft.VisualStudio.Web.Host.exe juga.
jerhewet
Ini juga berfungsi saat menjalankan build dari baris perintah, misalnya skrip batch, server build, dll.
Dave E