2010-02-17 21 views
6

Con MSBuild, tan pronto como se produce un error, la ejecución del proyecto se detiene a menos que ContinueOnError=true.¿Cómo se detiene la ejecución de MSBuild sin generar un error?

¿Hay alguna forma de detener la ejecución del proyecto sin generar un error?

Me gustaría tener esta posibilidad porque tengo un conjunto existente de archivos de proyecto msbuild y en algunas circunstancias, tendría que dejar de procesar los proyectos sin generar un error porque es un punto de salida normal para el proceso y No quiero que la persona que usa el guión piense que algo anda mal.

Sé que podría establecer algunas propiedades y poner todas las tareas pendientes condicional en esto, pero me gustaría evitar eso.

+0

¿Qué quiere decir "* punto de salida normal *". Si los objetivos no se han completado, ¿cuál fue el objetivo? ¿Cómo puede ser esto normal? ¿Puede explicar con más detalle lo que está tratando de lograr para que podamos entender qué es exactamente lo que necesita? –

Respuesta

7

Como usted lo explica, desea detener su construcción en circunstancias especiales sin generar un error porque es un punto de salida normal. ¿Por qué no crear un objetivo sin hacer nada que sirva como punto de salida? Bajo sus condiciones especiales, llamará a este objetivo.

<target Name="BuildProcess"> 
    <Message Text="Build starts"/> 
    ... 
    <CallTarget Targets="Exit" 
       Condition="Special Condition"/> 

    <CallTarget Targets="Continue" 
       Condition="!(Special Condition)"/> 
    ...  
</target> 

<target Name="Continue"> 
    <Message Text="Build continue"/> 
</target> 

<target Name="Exit"> 
    <!-- This target could be removed --> 
    <!-- Only used for logging here --> 
    <Message Text="Build ended because special condition occured"/> 
</target> 
+1

Esto es realmente ingenioso, pero no funciona para mí usando msbuild 4.0. La ejecución vuelve al objetivo que utilizó CallTarget y continúa (por lo que "Build continue" también se imprime en la pantalla). ¿Hay alguna solución alternativa que pueda sugerir? – charisk

+0

He actualizado mi respuesta, debería funcionar mejor ahora. –

+0

Gracias. Pero ahora no hay necesidad del objetivo de salida. Si no se cumple la condición especial, saltamos al objetivo Continuar, de lo contrario permaneceremos en BuildProcess (que debería terminar ahí). – charisk

2

La forma de hacerlo es crear otro objetivo para envolver el objetivo que le interesa acondicionar.

Así que si usted tiene un escenario con una diana de esta manera:

<Target Name="MainTarget"> 
command - run under a certain condition 
command - run under a certain condition 
command - run under a certain condition 
command - run under a certain condition 
command - run under a certain condition 
</Target> 

El punto es que desea guardar tener que utilizar la instrucción condición de un montón de veces, ¿verdad?

Para hacer frente a esto, se puede hacer esto:

<Target Name="MainWrapper" DependsOnTargets="EstablishCondition;MainTarget" /> 

<Target Name="EstablishCondition"> 
<SomeCustomTask Input="blah"> 
<Output PropertyName="TestProperty" TaskParameter="value" /> 
</SomeCustomTask> 
</Target> 

<Target Name="MainTarget" Condition="$(TestProperty)='true'"> 

command 
command 
command 
command 
command 

</Target> 
0

Al final encontramos una solución elegante para un problema similar. Solo necesitaba volver a expresar mi preocupación desde "Romper/interrumpir la ejecución de MSBuild" a "Saltear los próximos objetivos".

<PropertyGroup> 
<LastInfoFileName>LastInfo.xml</LastInfoFileName> 
<NewInfoFileName>NewInfo.xml</NewInfoFileName> 
</PropertyGroup> 

<Target Name="CheckSomethingFirst" BeforeTargets="DoSomething"> 

<Message Condition="ConditionForContinue" 
      Text="Let's carry on with next target" /> 
<WriteLinesToFile Condition="ConditionForContinue" 
        File="$(NewInfoFileName)" 
        Lines="@(SomeText)" 
        Overwrite="true" /> 

<Message Condition="!ConditionForContinue" 
      Text="Let's discard next target" /> 
<Copy Condition="!ConditionForContinue" 
     SourceFiles="$(LastInfoFileName)" 
     DestinationFiles="$(NewInfoFileName)" /> 

</Target> 

<Target Name="DoSomething" Inputs="$(NewInfoFileName)" 
          Outputs="$(LastInfoFileName)"> 
<Message Text="DoSomethingMore" /> 
<Copy SourceFiles="$(NewInfoFileName)" 
     DestinationFiles="$(LastInfoFileName)" /> 
</Target> 

Esto funciona bien con un comando como:

msbuild.exe Do.targets /t:DoSomething 

donde objetivo HacerAlgo entradas/salidas se comprueban correctamente tras la aplicación del objetivo CheckSomethingFirst.

Cuestiones relacionadas