2011-01-27 17 views
12

quiero sobreescribir el archivo hosts en el equipo de Windows si el usuario lo permite:Ant: Condicional Copia

<input message="Do you want to overwrite the HOSTS file?" 
     addproperty="overwrite.hosts" validargs="yes,no" /> 

<copy tofile="${env.WINDIR}/system32/drivers/etc/hosts.backup"> 
    <fileset file="${env.WINDIR}/system32/drivers/etc/hosts" /> 
</copy> 

<copy todir="${env.WINDIR}/system32/drivers/etc"> 
    <fileset file="${trainer.dir}/hosts" /> 
</copy> 

¿Cómo hago las copias sólo si el usuario dice que sí?

EDIT:

yo probamos este:

<input message="Do you want to overwrite the HOSTS file?" addproperty="overwrite.hosts" validargs="yes,no" /> 

    <if> 
     <equals arg1="${overwrite.hosts}" arg2="yes" /> 
     <then> 
      <copy tofile="${env.windir}/system32/drivers/etc/hosts.backup"> 
       <fileset file="${env.windir}/system32/drivers/etc/hosts"> 
       </fileset> 
      </copy> 

      <copy todir="${env.windir}/system32/drivers/etc"> 
       <fileset file="${trainer.dir}/hosts"> 
       </fileset> 
      </copy> 
     </then> 
    </if> 

y me da este resultado:

C:\trainer\build.xml:16: Problem: failed to create task or type if 
Cause: The name is undefined. 
Action: Check the spelling. 
Action: Check that any custom tasks/types have been declared. 
Action: Check that any <presetdef>/<macrodef> declarations have taken place. 

Soy un novato hormiga ... ¿Qué necesito hacer?

Respuesta

7

Puede usar un parámetro "if" en un destino para hacerlo condicional en la propiedad que se está configurando.

Nunca utilicé la tarea de "entrada". No sabía que existía hasta ahora (¡gracias por el aviso!), Pero un vistazo rápido a la documentación indica que establece la propiedad indicada al valor ingresado, es decir, después de una "entrada" la propiedad siempre se establece. Así que supongo que necesitaría una "condición" para probar el valor y establecer o no establecer alguna otra propiedad.

Algo como esto. Acabo de hacer una prueba rápida y esto funciona. A saber, si responde la pregunta "y", imprime el mensaje, y si responde "n", no.

<project name="test" default="do.whatever"> 
    <target name="decide.do.whatever"> 
    <input message="So you wanna do this or not?" validargs="y,n" addproperty="wanna"/> 
    <condition property="wanna.yes"> 
     <equals arg1="${wanna}" arg2="y"/> 
    </condition> 
    </target> 
    <target name="do.whatever" depends="decide.do.whatever" if="wanna.yes"> 
    <echo message="Yeah he wannas."/> 
    </target> 
</project> 
+0

para esto tengo que crear un objetivo más. Es por cada trabajo condicional que tengo que probar, luego establecer propiedad y crear un nuevo objetivo que se llamará en la propiedad del conjunto. Cualquier otra manera ? –

+0

Sí, exactamente, si el objetivo copia un montón de archivos diferentes de diferentes lugares y SOLO desea copiar algunos archivos pero no otros ... necesita objetivos redundantes con el mismo conjunto de tareas, frente a la condición dentro de los objetivos para decidir qué tareas para llamar o no – sloven

9

Puede usar condition o if task para eso. (Este último es parte del proyecto ant-contrib).

+1

No es la tarea de condición, en realidad. –

+2

No he utilizado la hormiga durante mucho tiempo, por lo que no estaba seguro de la nomenclatura, pero en realidad en la 'condición' de los documentos apareció bajo las tareas (http://ant.apache.org/manual/Tasks/). – miku