2012-09-20 5 views
7

Me gustaría llamar a un determinado EXE de mi script NAnt, y pasar una propiedad como argumento en caso de que exista la propiedad, o no pasar nada de lo contrario.¿Cómo pasar argumentos a la tarea del ejecutor NAnt condicionalmente en función de la existencia de la propiedad?

El código de abajo parece encajar sólo para este caso, pero no funciona:

<exec program="notepad.exe"> 
    <arg line="${file}" if="${property::exists('file')}" /> 
</exec> 

Es tirar Property 'file' has not been set error. Parece que evalúa la propiedad ignorando la condición. Esperaría que ignore todo el elemento <arg> en caso de que su condición sea false.

Si defino la propiedad sobre este bloque, obviamente funciona bien (incluso si la propiedad está vacía). Podría valer la pena una solución si es un caso único, pero tengo que pasar varias propiedades de la misma manera. Además, <if> no es un elemento válido en <exec> ...

¿Cómo lograr esto? ¿Algunas ideas?

Respuesta

7

I dag cabo an old thread at NAnt mailing list, que en realidad le da la mejor sugerencia para una solución (a mi caso). Se basa en el hecho de que la tarea <property> funciona como se esperaba. La solución alternativa introduce una propiedad adicional para establecer dependiendo de si la propiedad original está definida o no.

De esta manera:

<target name="example"> 
    <property name="arg.value" value="${arg}" if="${property::exists('arg')}" /> 
    <property name="arg.value" value="" unless="${property::exists('arg')}" /> 
    <exec program="program.exe"> 
    <arg value="${arg.value}" /> 
    </exec> 
</target> 

En mi caso resulta ser más fácil siempre se establece una propiedad con valor por defecto, e incluso no introducen una propiedad adicional - sólo tiene que pasar a la propiedad original <arg/>:

<target name="example"> 
    <property name="arg.value" value="default value" overwrite="false" /> 
    <exec program="program.exe"> 
    <arg value="${arg.value}" /> 
    </exec> 
</target> 

Se puede (y se) sobrescribirá en otros archivos incluidos.

También encontré another thread where the same question was asked, y una persona involucrada en el desarrollo NAnt sugirió indicar si las personas están interesadas en un parche para arreglar esto para el elemento <arg>. Por lo que puedo ver, nadie demostró el interés :), por lo tanto, el comportamiento no se modificó.

Logré dedicar un poco de tiempo a investigar qué solución podría haber, y parece que solo se trata de agregar ExpandProperties=false al TaskAttribute por ejemplo. la propiedad line de la tarea <arg>. Lo mismo se hace para el atributo <property value="..."> donde funciona según lo esperado. Aunque no lo probé, si tengo más tiempo uno de estos días, lo haré y publicaré una actualización aquí.

+0

Opcionalmente, puede establecer el valor predeterminado de la misma variable que está leyendo. Esto parece más claro y es una sola declaración en su lugar. BradLaney

+0

Según su caso de uso, ¿quiere decir lo siguiente para su segundo fragmento de código?

0

Para ese caso, puede usar un conjunto de archivos para pasar como argumentos. De forma predeterminada, el conjunto de archivos no incluye elementos que no coinciden con los archivos reales en el disco.

+0

Gracias por su sugerencia. Lamentablemente, no solo se trata de archivos, sino de una muestra. Tengo que aprobar una gran cantidad de argumentos, de diversa naturaleza. Daré forma a lo que terminé en una respuesta. –

0

También me encontré con este problema (para ser sincero, incluso más de una vez). El atributo if-en algunos casos no funciona como es de esperar. Este es mi fea solución:

<choose> 
    <when test="${property::exists('file')}"> 
    <exec program="notepad.exe"> 
     <arg line="${file}" /> 
    </exec> 
    </when> 
    <otherwise> 
    <exec program="notepad.exe" /> 
    </otherwise> 
</choose> 
+0

Gracias por su sugerencia. Bueno, eso tiene sentido para 1 argumento, pero tengo que aprobar una gran cantidad de argumentos. Daré forma a lo que terminé en una respuesta. –

Cuestiones relacionadas