2010-10-12 22 views
76

Uso TeamCity que a su vez invoca msbuild (.NET 4). Tengo un problema extraño cuando termina 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.msbuild.exe permaneciendo abierto, bloqueando archivos

Esto sucede casi todo el tiempo.

Estoy realmente perdido en esta, así que trataré de proporcionar tantos detalles como sea posible.

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

¿Alguien ha topado con esto antes?

Respuesta

104

Use msbuild con /nr:false.

En pocas palabras: 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 dar un giro, después de que se complete la compilación, estos procesos se mantienen (de forma predeterminada, durante 15 minutos, creo), de modo que si vuelve a construir pronto, estos nodos se pueden "reutilizar" y ahorrar el costo de configuración del proceso. Pero puede desactivar ese comportamiento desactivando nodeReuse con la opción de línea de comando mencionada anteriormente.

Consulte también:

+2

tiene sentido: no parece que suceda si elimino/m. Lo estoy intentando ahora con '/ m/nr: false', voy a ejecutar algunas compilaciones y ver cómo funciona. Gracias – gregmac

+0

Han pasado un par de días, y decenas de compilaciones más tarde, y no ha vuelto a suceder, parece que ya está resuelto. Gracias – gregmac

+1

¡Genial! Encantado de ayudar. – Brian

35

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

MSBUILDDISABLENODEREUSE=1 
+0

Utilicé 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 ¿ese? –

+0

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

+1

@dan Gracias sinceras por encontrar esta, y estoy * rezando * hay una variable de entorno para deshabilitar también Microsoft.VisualStudio.Web.Host.exe. – jerhewet

Cuestiones relacionadas