¿Cómo puedo ejecutar una determinada tarea de limpieza después de ejecutar mi objetivo de "Prueba", independientemente de si el objetivo de Prueba tuvo éxito o falló (como la construcción try...finally en C#/Java).intenta ... finalmente equivalente en MsBuild
Respuesta
El elemento Target tiene un atributo OnError que puede establecer en un destino para ejecutar en caso de error, pero como solo se ejecuta si el destino tiene un error, solo resuelve la mitad del escenario.
¿Ha considerado encadenar objetivos juntos para representar los "pasos" de prueba que desea ejecutar?
<PropertyGroup>
<TestSteps>TestInitialization;Test;TestCleanup</TestSteps>
</PropertyGroup>
El objetivo 'TestInitialization' es donde se puede realizar cualquier inicialización de prueba, el objetivo de 'Prueba' ejecuta la prueba, el objetivo 'TestCleanup' hace ningún tipo de ensayo posterior a limpiar.
A continuación, ejecutar estos objetivos mediante el tarea CallTarget, utilizando el atributoRunEachTargetSeparately establecido en verdadera. Esto ejecutará todos los objetivos, independientemente de su éxito o error.
La muestra completa es a continuación:
<Project DefaultTargets = "TestRun"
xmlns="http://schemas.microsoft.com/developer/msbuild/2003" >
<!-- Insert additional tests between TestInitialization and TestCleanup as necessary -->
<PropertyGroup>
<TestSteps>TestInitialization;Test;TestCleanup</TestSteps>
</PropertyGroup>
<Target Name = "TestRun">
<CallTarget Targets="$(TestSteps)" RunEachTargetSeparately="True" />
</Target>
<Target Name = "TestInitialization">
<Message Text="Executing Setup..."/>
</Target>
<Target Name = "Test">
<Message Text="Executing Test..."/>
<!-- this will fail (or should unless you meet the conditions below on your machine) -->
<Copy
SourceFiles="test.xml"
DestinationFolder="c:\output"/>
</Target>
<Target Name = "TestCleanup">
<Message Text="Executing Cleanup..."/>
</Target>
</Project>
O utilice <OnError>
para llamar a su objetivo en el caso de error, y DependsOnTargets
o CallTarget
para llamar a su mismo objetivo en el caso normal.
- 1. tratar ... finalmente equivalente en Matlab
- 2. Comando msbuild equivalente para publicar desde VS2008
- 3. Automatización de comandos de cygwin en la línea de comandos de Windows (y finalmente en MsBuild)
- 4. finalmente bloquear en C#
- 5. ¿Comportamiento extraño finalmente?
- 6. python try: excepto: finalmente
- 7. cómo usar finalmente
- 8. Usando finalmente en lugar de captura
- 9. C# StreamReader en una prueba/finalmente
- 10. Establecer referencia = nulo en bloque finalmente?
- 11. Se omite la excepción finalmente
- 12. ¿Por qué usamos finalmente bloques?
- 13. GWT intenta cargar un módulo eliminado
- 14. Double-Loop en msbuild?
- 15. Inhabilitar publicaciones en MSBuild
- 16. MSBuild NullReferenceException en Microsoft.TeamTest.targets
- 17. ¿Intenta capturar el ejecutable exe en Powershell?
- 18. Zend_Search_Lucene intenta asignar 3503812093817007931 bytes
- 19. Capybara-webkit intenta abrir example.com
- 20. Finalmente el bloque no se está ejecutando?
- 21. ¿Está bien usar try catch inside finalmente?
- 22. Usando statement y try-catch() - finalmente ¿repetición?
- 23. ¿Por qué se ejecuta este "finalmente"?
- 24. Configuración para ProjectReference en MSBuild
- 25. Vaciar un grupo de elementos MSBuild
- 26. Cajón deslizante equivalente en iOS
- 27. ¿Cómo puedo hacer que MSBuild construya por completo un proyecto Delphi equivalente a dcc32 -b?
- 28. ¿El uso de NSLocking siempre debe estar en @ try/@ finalmente?
- 29. Comportamiento de la declaración de devolución en catch y finalmente
- 30. ¿Retorno en prueba y captura versus devolución finalmente?
Acabo de probar esto ahora, y funciona perfectamente. Gracias por el ejemplo bastante completo. – ripper234
np! Me alegro de que funcionó! –
Buena respuesta, aunque sería bueno saber cómo "volver a lanzar", para continuar con la analogía try/finally. La limpieza puede necesitar ejecutarse sin importar qué, pero la compilación aún falla. –