2011-01-27 16 views
12

voglio sovrascrivere i file hosts sulla macchina Windows se l'utente lo permette:Ant: condizionale 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> 

Come faccio a fare le copie solo se l'utente dice di sì?

EDIT:

ho provato questo:

<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> 

e ottengo questo output:

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. 

Sono un rookie formica ... Che cosa devo fare?

risposta

7

È possibile utilizzare un parametro "se" su un obiettivo per renderlo condizionale sulla proprietà impostata.

Non ho mai utilizzato il task "input" - non sapevo che esistesse fino ad ora (grazie per l'heads up!) - ma una rapida occhiata alla documentazione indica che imposta la proprietà denominata al valore inserito, cioè dopo un "input" la proprietà è sempre impostata. Quindi suppongo che avresti bisogno di una "condizione" per testare il valore e impostare o non impostare altre proprietà.

Qualcosa di simile. Ho appena eseguito un test rapido e questo funziona. Vale a dire, se rispondi alla domanda "y", stampa il messaggio, e se rispondi "n" non lo fa.

<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

per questo devo creare un altro bersaglio. Questo è per ogni lavoro condizionale che devo testarlo, quindi impostare la proprietà e creare un nuovo target che verrà chiamato sulla proprietà set? Ogni altro modo ? –

+0

Sì, esattamente, cosa succede se il tuo obiettivo è copiare un sacco di file diversi da luoghi diversi e vuoi solo copiare alcuni file ma non altri ... hai bisogno di obiettivi ridondanti con lo stesso insieme di compiti, vs condizioni all'interno dei target per decidere quale compiti da chiamare o meno – sloven

9

È possibile utilizzare uno condition o uno if task per quello. (Quest'ultimo fa parte del progetto ant-contrib.)

+1

Non il compito di condizione, in realtà. –

+2

Non ho usato formica per molto tempo, quindi non ero sicuro della nomenclatura, ma in realtà la 'condizione' dei documenti è stata visualizzata sotto task (http://ant.apache.org/manual/Tasks/). – miku