2012-06-22 18 views
17

sto ottenendo l'erroreGradle accumulo compito esiste già questione

Cannot add task ':webserver:build' as a task with that name already exists. 

La cosa strana è il mio compito hello va bene, ma il mio compito build non è e sì, sto cercando di ignorare compito di compilazione del plugin Java.

Maestro build.gradle di file:

allprojects { 
    apply plugin: 'java' 
    apply plugin: 'eclipse' 

    task hello << { task -> println "I'm $task.project.name" } 
    task build << { task -> println "I'm building now" } 
} 

subprojects { 

    hello << {println "- I depend on stserver"} 

    build << { println "source sets=$sourceSets.main.java.srcDirs" } 
} 

Figlio mio webserver build.gradle di file:

sourceSets.main{ 
    java.srcDirs = ['app'] 
} 

build << { println "source sets=$sourceSets.main.java.srcDirs" } 

hello << {println "- Do something specific xxxx"} 

Qual è il problema qui, è prevalente build speciale o qualcosa del genere? Ignorare la mia attività hello ha funzionato bene e ho pensato che la sostituzione di build sarebbe stata altrettanto semplice?

risposta

9

What is the deal here, overriding build is special or something. Overriding my own hello task worked fine and I thought overriding build would be just as simple?

La ragione del comportamento sembra diverso perché build compito esiste già e hello no (e non perché build è speciale).

In Gradle non si può fare questo:

task hello << { print "hello" } 
task hello << { print "hello again" } 

Ciò con l'errore familiare: "Cannot add task ':hello' as a task with that name already exists.".

Poiché l'attività build esiste già, è illegale disporre di un secondo task build << { ... }. Tuttavia, funzionerà per l'attività hello, perché non esiste, e quindi task hello << { ... } è legale, in quanto è la prima dichiarazione di attività hello.

Se si sostituisce il task build << { ... } con build << { ... }, che aggiunge solo un comportamento più a un esistente compito , sarà "compilazione" bene.

+0

heh, l'avevo provato e non ha funzionato, ma alla fine ho scoperto che c'era un altro compito in un altro file gradle che mi era sfuggito ... il mio stupido errore. –

10

Non sei sovrascrivendo il compito hello, si sono solo l'aggiunta di ulteriori azioni attività. È possibile eseguire l'override di un'attività con task foo(overwrite: true). Non ho trovato una buona ragione per ignorare l'attività build; ci sono probabilmente modi migliori per ottenere quello che vuoi.

+0

probabilmente, ma per ora, ho solo bisogno di avere fatto ... se ho capito bene di più, io certamente necessario rivedere alcune cose. –

+0

@Peter Grazie davvero aiutato. Overwirte è davvero utile quando abbiamo a che fare con più file di script gradle. Per istanza: Supponiamo che A.gradle abbia qualche compito e sia usato in (applicare da: 'A.gradle') B.gradle e C.gradle. Ora c'è un altro file gradle che dice che D.gradle ha bisogno sia delle caratteristiche B che C. Affronteremo la duplicazione delle attività per tutte le attività definite in A quando la importeremo. E sento che dichiarare la sovrascrittura vera per i compiti definiti in A.gradle sarebbe giusto pensare di fare. O dovrebbe esserci qualche altra soluzione alternativa di cui non sono a conoscenza. –

Problemi correlati