2010-04-15 7 views
11

Ho la seguente funzione pulita nel mio script di compilazione e vorrei sapere come posso migliorarlo.L'attività di eliminazione di Ant fallisce quando esiste una directory e non viene cancellata ma non quando non esiste affatto

<target name="clean" description="Clean output directories."> 
    <!-- Must not fail on error because it fails if directories don't exist. 
     Is there really no better way to do this? --> 
    <delete includeEmptyDirs="true" failonerror="false"> 
     <fileset dir="${main.build.directory}" /> 
     <fileset dir="dist" /> 
     <fileset dir="${documentation.build.directory}" /> 
     <fileset dir="/build-testing" /> 
    </delete> 
</target> 

In particolare per quanto riguarda il mio commento, io sono infelice con il fatto che non posso correre questo su una scatola fresco perché la struttura di directory non è stato impostato ancora dagli altri obiettivi. Eseguiamo la build in modo tale da ricreare completamente le strutture necessarie per il test e la distribuzione ogni volta per evitare file di classe obsoleti e così via. Con il modo in cui è attualmente impostata l'eliminazione, un errore nell'eliminare un file non ha esito negativo nella compilazione e mi piacerebbe farlo. Io non voglio che fallisca la compilazione se il file non esiste però. Se non esiste, allora quello che sto chiedendo di fare è già successo.

Pensieri?

+0

Puoi auto-rispondere invece di modificare la domanda? Puoi accettare la tua risposta e poi posso cancellare la mia, dal momento che ha sbagliato. –

+1

Ecco, signore. :) –

risposta

9

via Michael's answer, che era il 90% di quello che mi serviva, ma non del tutto.

La soluzione reale che ho finito con a causa delle vostre risposte è il seguente:

<target name="clean" description="Clean output directories."> 
    <!-- Must not fail on error because it fails if directories don't exist. 
     Is there really no better way to do this? --> 
    <delete includeEmptyDirs="true" failonerror="false"> 
     <fileset dir="${main.build.directory}" /> 
     ... 
    </delete> 

    <available 
      file="${main.build.directory}" 
      type="dir" 
      property="delete-main-failure" /> ... 

    <condition property="delete-failure"> 
     <and> 
      <isset property="delete-main-failure" /> ... 
     </and> 
    </condition> 
    <fail 
      if="delete-failure" 
      message="Unable to delete previous build's directories." /> 
</target> 

Questo soddisfa i miei criteri che il codice tenta di eliminarlo e poi non riesce se esiste ancora. È bruttissimo però. Il comportamento predefinito dell'attività di cancellazione mi sembra molto strano. Suppongo che la logica sia che se si tenta di cancellare qualcosa e non c'è, allora qualcosa deve essere sbagliato, ma mi sembra che il caso normale sarebbe che se non è lì non ti interessa perché è già andato via mentre il caso strano è che avevi bisogno che fosse lì, ma ora non dovrebbe più essere in questa fase specifica della build.

+0

"Il comportamento predefinito dell'attività di cancellazione mi sembra molto strano" Mi sembra sbagliato. – leonbloy

+0

Il task di condizione sembra ridondante qui. – mcsilvio

5

Sono venuto qui per fare la stessa domanda ... non sembra che ci sia un modo elegante per risolvere questo. Quando voglio mantenere il codice pulito, lo faccio in questo modo:

<mkdir dir="${main.build.directory}" /> 
<delete dir="${main.build.directory}" failonerror="true" /> 

non pensavo che il compito di eliminazione ha avuto un "se" di proprietà. Dovrà verificarlo.

Problemi correlati