msbuild.exe tetap terbuka, mengunci file

Saya menggunakan TeamCity yang pada gilirannya memanggil msbuild (.NET 4). Saya memiliki masalah aneh setelah pembangunan selesai (dan sepertinya tidak masalah apakah pembangunan 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.

Hal ini hampir terjadi setiap saat.

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

  • Servernya adalah Intel Core i7, ram 2 GB, dengan standar Windows Server 2008 64-bit SP2.
  • Di TeamCity, pelari msbuild dikonfigurasi dengan parameter baris perintah /m (yang berarti menggunakan banyak inti)
  • File yang dimaksud adalah 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 direktori External Tools dalam struktur jalur serupa yang tidak pernah menyebabkan masalah ini). Saat ini, ini adalah versi uji coba dari laporan Telerik, jika ada perbedaan.
  • Ketika masalah ini terjadi, selalu ada beberapa msbuild.exe *32 proses yang terdaftar di Task manager: Saya yakin ada 7. Menggunakan Process Explorer, semuanya terlihat seperti proses tingkat atas (tidak ada induknya). Semuanya menggunakan ram 20-50MB, dan CPU 0,0%.
  • Jika saya menunggu 1-3 menit, proses msbuild.exe akan 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 mengonfirmasi bahwa msbuild.exe yang menyebabkan masalah).
  • Tidak ada properti khusus di Telerik.reporting.dll. Satu-satunya properti SVN adalah svn:mime-type = application/octet-stream

Adakah yang pernah mengalami ini sebelumnya?


person gregmac    schedule 12.10.2010    source sumber


Jawaban (2)


Gunakan msbuild dengan /nr:false.

Secara singkat: MSBuild mencoba melakukan banyak hal agar cepat, terutama dengan pembangunan paralel. Ini akan memunculkan banyak "node" - proses msbuild.exe individual yang dapat mengkompilasi proyek, dan karena proses membutuhkan sedikit waktu untuk berjalan, setelah pembangunan selesai, proses ini bertahan (secara default, selama 15 menit, menurut saya ), sehingga jika Anda segera membangunnya kembali, node ini dapat "digunakan kembali" dan menghemat biaya penyiapan proses. Namun Anda dapat menonaktifkan perilaku tersebut dengan mematikan nodeReuse dengan opsi baris perintah yang disebutkan di atas.

Lihat juga:

person Brian    schedule 12.10.2010
comment
Masuk akal: sepertinya tidak terjadi jika saya menghapus /m. Saya mencoba sekarang dengan /m /nr:false, saya akan menjalankan beberapa build dan melihat bagaimana hasilnya. Terima kasih - person gregmac; 13.10.2010
comment
Sudah beberapa hari, dan puluhan pembangunan kemudian, dan itu tidak terjadi lagi - sepertinya sudah terpecahkan. Terima kasih - person gregmac; 15.10.2010
comment
Bagaimana Anda membuat Visual Studio membangun proyek dengan opsi msbuild itu? - person Cameron Taggart; 14.04.2012
comment
Saya masih ingin tahu, tapi sebenarnya saya mengalami bug Visual Studio 11 Beta untuk proyek C++/CLI. Apakah menyebabkan gejala yang sama: connect.microsoft.com/VisualStudio/feedback/details/728912/ - person Cameron Taggart; 14.04.2012
comment
Posting ini membantu saya memecahkan masalah terkait saya, yang didokumentasikan di sini: - stackoverflow.com/questions/13510465/ - person Jon Rea; 22.11.2012
comment
Tautan atas di atas mati (setelah masuk ke Microsoft Connect) - person thecoolmacdude; 30.08.2016
comment
@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/ - person needfulthing; 10.07.2019

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

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