visual studio 2010 - tag - ¿Qué es la limpieza incremental en msbuild y cuándo se activa?
visual studio code autocomplete html (3)
Estoy depurando un error en mi proceso de compilación que ocurre ocasionalmente pero no puedo reproducirlo directamente. Estoy usando msbuild con teamcity.
Tengo una jerarquía de dependencias como esta:
Some.Interop.dll
Dependency-> SharedDllABC.dll
SomeService.exe
Depenendcy-> Some.Interop
Por lo general, el servicio final se puede obtener en su directorio de lanzamiento:
Some.Interop
SharedDllABC.Dll
ServiceExectuable.exe
Sin embargo, puedo ver en nuestros registros de msbuild que a veces la dependencia terciaria se elimina durante una limpieza incremental después de que todo se genera, lo que resulta en:
Some.Interop
ServiceExectuable.exe
Puedes verlo aquí en el registro de msbuild:
[src/SomeService/SomeService.csproj] _TimeStampAfterCompile
[12:32:43]: [src/SomeService/SomeService.csproj] Compile
// some other targets
[12:32:43]: [src/SomeService/SomeService.csproj] _CopyFilesMarkedCopyLocal
[12:32:43]: [_CopyFilesMarkedCopyLocal] Copy
[12:32:43]: [Copy] Copying file from "C:Projects/trunk/src/Some.Interop/bin/Release/Some.Interop.dll" to "bin/Release/Some.Interop.dll".
// some other targets
[src/Project/SomeService/SomeService.csproj] IncrementalClean
[18:54:42]: [IncrementalClean] Delete
[18:54:42]: [Delete] Deleting file "C:/Projects/trunk/src/Project/SomeService/bin/Release/SharedDllABC.dll".
[18:54:42]: [Delete] Deleting file "C:/Projects/trunk/src/Project/SomeServiceService/bin/Release/SharedDllABC.pdb".
[18:54:42]: [src/Project/SomeService/SomeService.csproj] CoreBuild
[18:54:42]: [src/Project/SomeService/SomeService.csproj] AfterBuild
[18:54:42]: [src/Project/SomeService/SomeService.csproj] Build
Esta es mi salida directa de msbuild, acabo de cambiar los nombres de proyecto / dll para coincidir con mi ejemplo. En el momento en que se haya realizado esta limpieza incremental, SomeService.csproj
ya se SomeService.csproj
creado. Se puede ver que no se está copiando. Sin embargo, en otros registros de msbuild, se copia correctamente y luego la limpieza incremental no lo elimina.
Creo que la limpieza incremental de esta publicación se supone que limpia las dll creadas a partir de versiones anteriores, pero eso no explica cómo esta dll no se construyó la mayoría de las veces. En el estudio visual esto siempre funciona así.
Supongo que solo quiero saber qué es exactamente Incremental clean
, qué causa que se active, y tal vez qué debo buscar al depurar una situación como esta (versiones de ensamblaje, marcas de tiempo, etc.)
@Kebabbi recomienda una buena solución, pero hay una forma sencilla de aplicar todos estos archivos CSPROJ, en lugar de editar cada archivo csproj.
Esto ya no es necesario con MSBuild 15 - https://docs.microsoft.com/en-us/visualstudio/msbuild/customize-your-build?view=vs-2017
Cree un archivo Directory.Build.props
y colóquelo junto al archivo SLN.
<Project>
<Target
Name="ForceAssignProjectConfigurationBeforeSplitProjectReferencesByFileExistence_KLUDGE"
BeforeTargets="_SplitProjectReferencesByFileExistence"
DependsOnTargets="AssignProjectConfiguration" />
</Project>
Esto podría deberse a un error en MsBuild: https://github.com/Microsoft/msbuild/issues/1054 . Se propone una solución en los comentarios: https://github.com/Microsoft/msbuild/issues/1054#issuecomment-406438561
Cuando MsBuild determina qué elementos copiar de los proyectos a los que se hace referencia, debe hacerlo recursivamente pero no lo hace correctamente.
Como solución alternativa, se puede agregar lo siguiente a cada csproj.
<Target Name="ForceAssignProjectConfigurationBeforeSplitProjectReferencesByFileExistence_KLUDGE" BeforeTargets="_SplitProjectReferencesByFileExistence" DependsOnTargets="AssignProjectConfiguration" />
Intente lo siguiente:
Añadir:
<Target Name="IncrementalClean" />
a un archivo .targets que está incluido en todos los proyectos.