.net - MSBuild error MSB3021: No se puede copiar el archivo. No se pudo encontrar el archivo ''obj / Release / myWebProject1.dll''
.net-4.0 teamcity (6)
Cuando se usa TeamCity para compilar mi script de tareas de MSBuild XML, falla con esto:
[10:43:03]: myWebProject1/ myWebProject 1 .csproj (3s)
[10:43:07]: [ myWebProject1/ myWebProject1 .csproj] _CopyWebApplicationLegacy
[10:43:07]: [_CopyWebApplicationLegacy] Copy
[10:43:07]: [Copy] C:/Program Files/MSBuild/Microsoft/VisualStudio/v10.0/WebApplications/Microsoft.WebApplication.targets(131, 5): error MSB3021: Unable to copy file "obj/Release/myWebProject1.dll" to "C:/MSBUILDRELEASE/myWebProject1//bin/myWebProject1.dll". Could not find file ''obj/Release/myWebProject1.dll''.
Cuando lo ejecuto localmente, funciona.
Cuando comparo mi salida local con la salida de mi servidor de compilación, faltan archivos en mi servidor de compilación. Al igual que el archivo global.asax, falta en mi directorio de salida del servidor de compilación (pero no cuando compilo esto localmente). ¿Porqué es eso?
Aquí está mi actual MSBuildScript:
<?xml version="1.0" encoding="utf-8"?>
<Project
xmlns="http://schemas.microsoft.com/developer/msbuild/2003"
ToolsVersion="4.0"
DefaultTargets="Build">
<PropertyGroup>
<OutputDir>C:/MSBUILDRELEASE</OutputDir>
</PropertyGroup>
<ItemGroup>
<ProjectToBuild Include="UtilityApp.sln" >
<Properties>OutputPath=$(OutputDir);Configuration=MSBuildRelease;Platform=x86</Properties>
</ProjectToBuild>
</ItemGroup>
<Target Name="Build">
<MSBuild Projects="@(ProjectToBuild)"/>
<CallTarget Targets="Publish WebProject1" />
<CallTarget Targets="Publish WebProject2" />
</Target>
<Target Name="Publish WebProject1">
<RemoveDir Directories="$(OutputFolder)"
ContinueOnError="true" />
<MSBuild Projects="WebProject1/WebProject1.csproj"
Targets="ResolveReferences;_CopyWebApplication"
Properties="WebProjectOutputDir=$(OutputDir)/WebProject1/;
OutDir=$(OutputDir)/WebProject1/;Configuration=Release;Platform=AnyCPU" />
</Target>
<Target Name="Publish WebProject2">
<RemoveDir Directories="$(OutputFolder)"
ContinueOnError="true" />
<MSBuild Projects="WebProject2/WebProject2.csproj"
Targets="ResolveReferences;_CopyWebApplication"
Properties="WebProjectOutputDir=$(OutputDir)/WebProject2/;
OutDir=$(OutputDir)/WebProject2/;Configuration=Release;Platform=AnyCPU" />
</Target>
</Project>
Puedo ejecutar este script localmente y parece funcionar bien (no se generan errores). Cuando lo ejecuto en mi servidor de compilación, falla con MSBuild error MSB3021.
Ahora, cuando comparo mis archivos de salida de compilación local con los archivos de salida de compilación de mi servidor, la salida del servidor no tiene tantos archivos. Por ejemplo, el archivo global.ASAX falta en la salida de mi servidor de compilación. ¿Por qué funcionaría localmente para mí, pero no en mi servidor de compilación TeamCity? ¿Cuál es la diferencia y cómo puedo solucionarlo?
Noté que el mensaje de error del agente de compilación de TeamCity tiene una ruta de directorio divertida: "C: / MSBUILDRELEASE / myWebProject1 / bin / myWebProject1.dll"
^ Hay dos barras inclinadas antes de la carpeta bin. No especifico eso en ninguna parte. ¿Lo que da? Tengo la sensación de que no estoy creando mis proyectos web correctamente (¿tal vez utilice un enfoque de tarea diferente?). Parece funcionar localmente pero no en mi servidor de compilación.
¿Estoy construyendo mis proyectos web correctamente? Estos son simplemente proyectos web para la implementación de servicios web (ASMX). ¿Ayuda?
Después de pasar 3 horas en este error, comencé un nuevo proyecto e importé cada uno de los archivos del proyecto anterior uno por uno. He podido compilar entre cada archivo hasta que agregué el último archivo.
Pensé que el problema estaba relacionado con el último archivo, pero al eliminar otros archivos me di cuenta de que este problema estaba ocurriendo solo cuando tenía un número específico de archivos incluidos en mi proyecto.
No puedo decir por qué funcionó, pero resolví este problema agregando / eliminando clases vacías con nombres aleatorios a mi proyecto.
Después de un par de Agregar / Compilar / Eliminar / Compilar nuevamente, VS comenzó a funcionar correctamente.
Muy bien, lo descubrí. Es un desajuste de "Configuración". Tiene un proyecto de construcción con Configuration = MSBuildRelease y otros dos proyectos de construcción con Configuration = Release. MSBuild busca en el lugar equivocado los ensamblajes "intermedios".
Cambie su código a esto:
<?xml version="1.0" encoding="utf-8"?>
<Project
xmlns="http://schemas.microsoft.com/developer/msbuild/2003"
ToolsVersion="4.0"
DefaultTargets="Build">
<PropertyGroup>
<OutputDir>C:/MSBUILDRELEASE</OutputDir>
</PropertyGroup>
<ItemGroup>
<ProjectToBuild Include="UtilityApp.sln" >
<Properties>OutputPath=$(OutputDir);Configuration=MSBuildRelease;Platform=x86</Properties>
</ProjectToBuild>
</ItemGroup>
<Target Name="Build">
<MSBuild Projects="@(ProjectToBuild)"/>
<CallTarget Targets="Publish WebProject1" />
<CallTarget Targets="Publish WebProject2" />
</Target>
<Target Name="Publish WebProject1">
<RemoveDir Directories="$(OutputFolder)"
ContinueOnError="true" />
<MSBuild Projects="WebProject1/WebProject1.csproj"
Targets="ResolveReferences;_CopyWebApplication"
Properties="WebProjectOutputDir=$(OutputDir)/WebProject1/;
OutDir=$(OutputDir)/WebProject1/;Configuration=MSBuildRelease;Platform=AnyCPU" />
</Target>
<Target Name="Publish WebProject2">
<RemoveDir Directories="$(OutputFolder)"
ContinueOnError="true" />
<MSBuild Projects="WebProject2/WebProject2.csproj"
Targets="ResolveReferences;_CopyWebApplication"
Properties="WebProjectOutputDir=$(OutputDir)/WebProject2/;
OutDir=$(OutputDir)/WebProject2/;Configuration=MSBuildRelease;Platform=AnyCPU" />
</Target>
</Project>
Paso 1: Reinicie su Visual Studio.
Paso 2: Construir >> Reconfigurar aplicación.
Lo entendí de esta manera.
Si bien tuve el mismo error exacto; en mi caso tuve un proyecto de implementación Wix (v3.9) (MSI, para una aplicación de escritorio) que ejecutó Heat.exe para recoger el archivo de la carpeta de salida. Resultó que VS y Heat no juegan bien si no tienes el
RunAsSeparateProcess = "true"
atributo establecido en la tarea de precompilación del directorio de calor. Encontré esto después de muchas horas de frustración. ver Wix HeatFile Task Locks Dll para más detalles. HTH alguien.
Solo una corazonada, pero me doy cuenta de que está creando la solución con Platform = x86, y luego llama a los dos WebProjects con Platform = AnyCPU. Si la solución está generando esos dos proyectos, la ubicación de salida podría ser diferente para la compilación en comparación con la posterior llamada a implementar.
Algunas otras notas:
Generalmente evito CallTarget, y preferiría este formulario en su caso:
<Target Name="BuildProjects">
<MSBuild Projects="@(ProjectToBuild)" />
</Target>
<Target Name="Build"
DependsOnTargets="BuildProjects;Publish WebProject1;Publish WebProject2"
/>
Las barras inclinadas por lo general indican una de dos cosas:
$(OutDir)/$(Intervening)/bin
Una propiedad intermedia no se evaluó, si $ (Intervenir) está vacía, o una de las partes de la ruta ya termina en una barra diagonal final, si la propiedad $ (OutDir) ya tiene una barra diagonal final.
Nunca supe que podrías tener espacios en el nombre de un objetivo, ¡tuve que comprobarlo solo para estar seguro y funcionó!
Tuve este problema al intentar desplegar a appharbor, para mí, excluyendo el archivo y luego volviéndolo a incluir solucionó el problema