stagingdirectory artifactstagingdirectory argumentos msbuild team-build

artifactstagingdirectory - msbuild options



MSBuild & TeamBuild-BuildInParallel falla debido a la violaciĆ³n del permiso de archivo MSB3021 (6)

¿Qué compilador estás usando? Por lo que sé, hasta la compilación paralela VS2005 no funciona para varios proyectos. Es un problema conocido que MS sigue diciendo que lo solucionarán eventualmente, pero no tengo idea de si realmente lo resolvieron en VS2008.

Mantengo la construcción de una pieza de software bastante grande, que consta de aproximadamente 350 proyectos csharp. Nuestro tiempo de compilación para una debug construyó relojes en unos 17 minutos.

He estado buscando formas de mejorar el tiempo de compilación, y la propiedad BuildInParallel parecía intrigante. Especialmente ya que tenemos un servidor de cuatro núcleos que hace nuestras compilaciones, debería poder aprovechar la potencia de cómputo.

Pero, por desgracia ... Después de configurar la propiedad, modificar el archivo de configuración para el agente de compilación y reiniciarlo, la primera ejecución realmente pareció prometedora, mucho más rápido de lo normal, hasta el punto en el que falló.

Después de ver los registros de compilación, parece que la compilación falla cuando intenta copiar las referencias marcadas como CopyLocal = true en el directorio de salida. Si C # project A y C # project B se construyen en paralelo, y ambos hacen referencia a la misma DLL de terceros e intentan copiarla al mismo tiempo, el segundo proceso para intentar copiar el archivo obtendrá una infracción de acceso al archivo: El archivo está siendo utilizado por otro proceso.

¿Alguien ha experimentado esto y ha podido obtener construcciones de múltiples procesos trabajando en Team Build?

Aquí está uno de los fracasos, algo difícil de determinar qué otro proyecto se estaba construyendo al mismo tiempo.

He eliminado todas las cosas no relevantes:

54> Destino "_CopyFilesMarkedCopyLocal" en el archivo "c: / WINDOWS / Microsoft.NET / Framework / v3.5 / Microsoft.Common.targets" del proyecto "d: / temp / PCM / 1.3-Maint_CI / Sources / Modules / Core / Test / UnitTest / TestDIPS.Core.Data.Server.NUnit / TestDIPS.Core.Data.Server.NUnit.csproj ": 54> Tarea" Copiar "Copiando archivo de" .......... / Bin / 3rdParty / Oracle / Oracle.DataAccess.dll "to" d: / temp / PCM / 1.3-Maint_CI / Binaries / Debug / Oracle.DataAccess.dll ". Comando: copiar / y ".......... / Bin / 3rdParty / Oracle / Oracle.DataAccess.dll" "d: / temp / PCM / 1.3-Maint_CI / Binaries / Debug / Oracle.DataAccess.dll "54> c: / WINDOWS / Microsoft.NET / Framework / v3.5 / Microsoft.Common.targets (2703,9): error MSB3021: No se puede copiar el archivo" .......... / Bin / 3rdParty / Oracle / Oracle.DataAccess.dll "to" d: / temp / PCM / 1.3-Maint_CI / Binaries / Debug / Oracle.DataAccess.dll ". El proceso no puede acceder al archivo ''d: / temp / PCM / 1.3-Maint_CI / Binaries / Debug / Oracle.DataAccess.dll'' porque otro proceso lo está utilizando. Hecho ejecutando la tarea "Copiar" - FALLIDA. 54> Hecho el objetivo de construcción "_CopyFilesMarkedCopyLocal" en el proyecto "TestDIPS.Core.Data.Server.NUnit.csproj" - FAILED.



La tarea MS Build Copy tiene una función no documentada, al menos Google guarda silencio. Si se establece la variable de entorno de todo el sistema MSBUILDALWAYSRETRY = 1, esta tarea volverá a intentar copiar un archivo, incluso si obtiene una excepción de Acceso denegado durante la operación de copia

Ejemplo de salida

C:/Windows/Microsoft.NET/Framework/v4.0.30319/Microsoft.Common.targets (3513): Got System.UnauthorizedAccessException: Access to the path ''C:/Builds/8/28/Binaries/Release/fr/System.Spatial.resources.dll'' is denied. at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) at System.IO.File.InternalCopy(String sourceFileName, String destFileName, Boolean overwrite, Boolean checkHost) at System.IO.File.Copy(String sourceFileName, String destFileName, Boolean overwrite) at Microsoft.Build.Tasks.Copy.CopyFileWithLogging(FileState sourceFileState, FileState destinationFileState) at Microsoft.Build.Tasks.Copy.DoCopyWithRetries(FileState sourceFileState, FileState destinationFileState, CopyFileWithState copyFile) copying C:/Builds/8/28/Sources/Main/Solutions/packages/System.Spatial.5.2.0/lib et40/fr/System.Spatial.resources.dll to C:/Builds/8/28/Binaries/Release/fr/System.Spatial.resources.dll and HR is -2147024891 C:/Windows/Microsoft.NET/Framework/v4.0.30319/Microsoft.Common.targets (3513): Retrying on ERROR_ACCESS_DENIED because MSBUILDALWAYSRETRY = 1 C:/Windows/Microsoft.NET/Framework/v4.0.30319/Microsoft.Common.targets (3513): Could not copy "C:/Builds/8/28/Sources/Main/Solutions/packages/System.Spatial.5.2.0/lib et40/fr/System.Spatial.resources.dll" to "C:/Builds/8/28/Binaries/Release/fr/System.Spatial.resources.dll". Beginning retry 1 in 1000ms. Access to the path ''C:/Builds/8/28/Binaries/Release/fr/System.Spatial.resources.dll'' is denied.


Los objetivos predeterminados que se incluyen con MSBuild están diseñados para el comportamiento de CopyLocal, que es en lo que confía VS. CopyLocal es problemático cuando se está enviando a un solo directorio de salida.

Para poder construir verdaderamente en paralelo, deberá deshabilitar varios comportamientos específicos de CopyLocal en los archivos de objetivos de Microsoft. *. Common. *. He hablado con algunas personas en el equipo de MSBuild en el pasado, y esto es una cosa particularmente difícil de hacer. Incluso si deja en blanco parte del comportamiento de CopyLocal, los accesores de prueba de VS no se comportan bien con la compilación en paralelo.

Algunas de las cosas con las que puedes comenzar:

  1. Deshabilite el comportamiento de CopyLocal para las referencias estableciendo privado en verdadero.
  2. Deshabilite CopyLocal para los archivos CopyToOutputPath al crear proyectos dependientes.

Parece que tus proyectos están configurados para el mismo directorio de salida. Si configura el Proyecto A y el Proyecto B para dar salida a directorios diferentes, esto resolvería este error.


Tengo el mismo problema hace muchos meses.

Hay dos tipos de copia de archivo en los archivos de proyecto de VS C # (archivos .csproj):

  1. Conjuntos referenciados que tiene una propiedad "Copiar local". cuando la propiedad es True, el ensamblaje se copia en la ruta de salida.

  2. Archivos adicionales que tienen una propiedad de "Copiar a directorio de salida". cuando la propiedad está configurada para "copiar siempre" o "copiar si es más nueva", el archivo se copia en la ruta de salida.

problema:

R: Si dos o más proyectos se construyen al mismo tiempo, y dos de ellos intentan copiar el mismo archivo en el directorio de salida, puede enfrentar errores como "error MSB3021: no se puede copiar el archivo", "Se deniega el acceso a la ruta" , "El proceso no puede acceder al archivo", etc.

B: Si dos o más proyectos renuevan un proyecto común que tiene algunos elementos de tipo 2. En este caso, durante la compilación paralela de los proyectos, dos de ellos intentarán construir el objetivo "GetCopyToOutputDirectoryItems" del proyecto común al mismo tiempo. Así que puede volver a enfrentar las excepciones anteriores.

Solución 1:

forzar el OutputPath de diferentes archivos .csproj para que no estén en la misma ruta

http://social.msdn.microsoft.com/Forums/is/tfsbuild/thread/a62a6f98-ec44-46c1-a0d0-7f441f0db973

solucion2:

Paso 1: la solución es establecer la propiedad de los elementos comunes (en Falso en el caso 1 y "no copiar" en el caso 2) para todos menos uno de estos elementos comunes en sus proyectos. o eliminarlos si es posible.

Para encontrar posibles errores, puede buscar las palabras "privado" (para el caso 1) y "CopyToOutputDirectory" (para el caso 2) en los archivos * .csproj

Paso 2: ...

Buena suerte