msbuild.exe permanece abierto, bloqueando archivos


97

Yo uso TeamCity que a su vez invoca msbuild (.NET 4). Tengo un problema extraño porque después de que se completa una compilación (y no parece importar si fue una compilación exitosa o no), msbuild.exe permanece abierto y bloquea uno de los archivos, lo que significa que cada vez que TeamCity intenta para borrar su directorio de trabajo, falla y no puede continuar.

Esto sucede casi siempre.

Estoy realmente perdido en esto, así que intentaré proporcionar tantos detalles como sea posible.

  • El servidor es un Intel Core i7, 2 GB de RAM, con Windows Server 2008 estándar SP2 de 64 bits.
  • En TeamCity, el corredor de msbuild se configura con el /mparámetro de línea de comandos (lo que significa usar múltiples núcleos)
  • El archivo en cuestión es SIEMPRE la misma DLL externa a la que se hace referencia en uno de los proyectos .NET, en la ruta External Tools\Telerik\Telerik.Reporting.Dll. (Hay varios otros archivos .DLL incluidos en el External Toolsdirectorio en una estructura de ruta similar que nunca causan este problema). Actualmente esto es con la versión de prueba de los informes de Telerik, en caso de que eso haga alguna diferencia.
  • Cuando ocurre el problema, siempre hay varios msbuild.exe *32procesos enumerados en el Administrador de tareas: Creo que hay 7. Al usar Process Explorer, todos parecen procesos de nivel superior (sin padres). Todos usan desde 20-50 MB de RAM y 0.0% de CPU.
  • Si espero de 1 a 3 minutos, los procesos de msbuild.exe se cierran por sí solos y TeamCity puede actualizar el directorio de trabajo correctamente.
  • Si finalizo manualmente los procesos de msbuild, la actualización de TeamCity volverá a funcionar de inmediato.
  • Los servicios de indexación están desactivados en Windows (aunque los dos puntos anteriores confirman prácticamente que es msbuild.exe el que causa el problema).
  • No hay propiedades especiales en Telerik.reporting.dll. La única propiedad de SVN essvn:mime-type = application/octet-stream

¿Alguien se ha encontrado con esto antes?

Respuestas:


122

Usar msbuildcon /nr:false.

Brevemente: MSBuild intenta hacer muchas cosas para ser rápido, especialmente con compilaciones paralelas. Generará muchos "nodos": procesos individuales de msbuild.exe que pueden compilar proyectos, y dado que los procesos tardan un poco en activarse, una vez finalizada la compilación, estos procesos permanecen (de forma predeterminada, durante 15 minutos, creo ), de modo que si vuelve a compilar pronto, estos nodos se pueden "reutilizar" y ahorrar el costo de configuración del proceso. Pero puede deshabilitar ese comportamiento desactivando nodeReuse con la opción de línea de comandos mencionada anteriormente.

Ver también:


2
Tiene sentido: no parece suceder si elimino / m. Lo estoy intentando ahora /m /nr:false, ejecutaré algunas compilaciones y veré cómo va. Gracias
Gregmac

26
¿Cómo se consigue que Visual Studio cree el proyecto con esa opción de msbuild?
Cameron Taggart

1
Aún me gustaría saberlo, pero en realidad encontré un error de Visual Studio 11 Beta para proyectos C ++ / CLI. Causa los mismos síntomas: connect.microsoft.com/VisualStudio/feedback/details/728912/…
Cameron Taggart

3
La optimización prematura es verdaderamente la raíz de todos los males. Apestas, Microsoft.
johnwbyrd

1
@CameronTaggart Puede agregar opciones de línea de comandos de msbuild con un archivo especial alojado en su carpeta de proyecto / solución. Ver docs.microsoft.com/en-us/visualstudio/msbuild/…
needfulthing

43

Para deshabilitar la reutilización de nodos dentro de Visual Studio, debe usar una variable de entorno:

MSBUILDDISABLENODEREUSE=1

Usé esto de manera efectiva, sin embargo, hay otra herramienta que está fallando ahora, al compilar C ++ con VS11 Beta, eso es mt.exe, ¿hay alguna otra variable para usar para eso?
Eugenio Miró

¿No se puede configurar usando un cuadro de diálogo en algún lugar de VS?
dom_beau

1
@dan Gracias sinceras por encontrar este, y rezo para que haya una variable de entorno para deshabilitar Microsoft.VisualStudio.Web.Host.exe también.
jerhewet

Esto también funciona cuando se ejecuta una compilación desde la línea de comandos, por ejemplo, un script por lotes, un servidor de compilación, etc.
Dave E
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.