2009-07-21 13 views
7

Ho un file common.xml generico che contiene un numero di target generici nant che vengono riutilizzati tra più build. Quello che voglio fare è "sovrascrivere" alcuni di questi obiettivi nant e includere passaggi aggiuntivi prima o dopo l'esecuzione del target esistente.È possibile eseguire l'override dei target nent dal buildfile incluso?

Gli obiettivi attuali vengono utilizzati prima dal file corrente? vale a dire. Se creo un target nant nel file di build corrente con lo stesso nome di un target in un file incluso, viene richiamato quello che viene incluso e quello incluso viene ignorato? Se questo è il caso che posso fare e chiamare il target incluso, ma sembrerebbe che sarebbe una chiamata ricorsiva piuttosto che a un'attività inclusa.

Pensieri?

risposta

2

No, l'ho appena provato per te, poiché ho un set-up simile, in quanto ho tutti i target di build che usiamo in commonFile.build e poi usiamo il seguente codice per portarlo in ...

<include buildfile="../commonFile.build"/> 

nel mio newFile.build (che include il commonFile.build nella parte superiore del file), ho aggiunto un nuovo obiettivo denominato 'costruire', come esiste nel commonFile, ed ecco la messaggio di errore che si ottiene in risposta ...

generazione non riuscita

Destinazione duplicata denominata "build"!

Bella idea, probabilmente bourne dei principi OO, ma purtroppo non funziona.

Qualsiasi buono?

3

Ho avuto la stessa domanda (e ho trovato gli stessi risultati), ma ho anche trovato una soluzione alternativa. Consentitemi di illustrare con un esempio.

Si dispone di un ProjectFile.build e un CommonFile.build. Diciamo che vuoi sovrascrivere un obiettivo chiamato "Pulisci".

Si avrebbe bisogno di creare un nuovo file (chiamarlo CommonFile_Clean.build) che contiene:

<?xml version="1.0"?> 
<project> 
    <target name="Clean"> 
     <echo message="Do clean stuff here" /> 
    </target> 
</project> 

In CommonFile.build, è condizionatamente includono CommonFile_Clean.build:

<?xml version="1.0"?> 
<project> 
    <echo message="checking Clean definition..." /> 
    <if test="${not target::exists('Clean')}"> 
      <echo message="Clean target not defined." /> 
     <include buildfile="CommonFile_Clean.build" />  
    </if> 
</project> 

In Projectfile .build, è possibile definire la destinazione Clean (nel qual caso CommonFile_Clean.build non verrà utilizzato) o utilizzare l'implementazione predefinita come definito in CommonFile_Clean.build.

Ovviamente, se si dispone di un numero elevato di obiettivi, questo sarà un bel po 'di lavoro.

Spero che questo aiuti.