En mi solución, algunos proyectos tienen tareas que deben ejecutarse al final, como copiar archivos en varios lugares. Implementamos eso con AfterTargets="Build"
:Las fallas de AfterTargets no fallan ejecución de msbuild
<Target Name="CopyStuff" AfterTargets="Build">
<Copy SourceFiles="..." DestinationFolder="..." />
</Target>
Si funciona. Sin embargo, cuando la construcción de la solución (! No el proyecto individual), si la copia falla, se obtiene una advertencia acumulación rojo, pero msbuild (y por lo tanto TFS construcción) tiene éxito:
> msbuild /t:clean;build my.sln
(...)
(in red...) error MSB3021: Unable to copy file (...)
> echo %errorlevel%
0 <<<<<<< This means succeeded
A mi entender, eso es porque msbuild piensa que mientras el objetivo principal de "Construcción" haya pasado, todo pasó también.
Nuestra solución - Cambie el objetivo a BeforeTargets="AfterBuild"
, que coloca mi objetivo dentro del objetivo de compilación. Sin embargo, esto requiere conocimiento del contenido del objetivo "Compilar", y puede no funcionar para otros tipos de proyectos.
Pregunta:
- ¿Hay una manera de conseguir
AfterTargets="Build"
fracasos fallen solución se basa? - Si no, ¿hay alguna manera de validar automáticamente que las personas no agregaron
AfterTargets="Build"
en sus proyectos?