2012-06-22 9 views
17

estoy consiguiendo el errorGradle acumulación de tareas ya existe problema

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

Lo extraño es mi tarea hello está bien, pero mi tarea build no es Y sí, estoy tratando de anular la tarea de construcción del plugin de Java.

Maestro build.gradle archivo:

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

Mi servidor web niño build.gradle archivo:

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

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

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

¿Cuál es el problema aquí, es reemplazar build especial o algo? Sobrescribir mi propia tarea hello funcionó bien y pensé que reemplazar build sería igual de simple?

Respuesta

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 razón del comportamiento parece diferente es porque build tarea ya existe y hello no lo hace (y no porque build es especial).

En Gradle no se puede hacer esto:

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

Este fallará con el error familiar: "Cannot add task ':hello' as a task with that name already exists.".

Dado que la tarea build ya existe, es ilegal tener una segunda task build << { ... }. Sin embargo, funcionará para la tarea hello, porque no existe y, por lo tanto, task hello << { ... } es legal, ya que es la primera tarea de la declaración hello.

Si reemplaza el task build << { ... } con build << { ... }, que sólo añade un comportamiento más a una tarea existente, será "compilar" bien.

+0

heh, lo había intentado y no funcionó, pero finalmente me encontré con otra creación de tareas en otro archivo gradle que me había perdido ... mi estúpido error. –

10

No está reemplazando la tarea hello, solo está agregando más acciones de tareas. Puede anular una tarea con task foo(overwrite: true). No he encontrado una buena razón para anular la tarea build; probablemente haya mejores formas de lograr lo que quieres.

+0

probablemente, pero por ahora, solo tengo que hacerlo ... ya que lo entiendo más, sin duda tendré que volver a visitar algunas cosas. –

+0

@Peter Gracias realmente ayudado. Overwirte es realmente útil cuando se trata de múltiples archivos de script gradle. Por ejemplo: supongamos que A.gradle tiene alguna tarea y se usa en (aplicar desde: 'A.gradle') B.gradle y C.gradle. Ahora hay otro archivo gradle que dice que D.gradle necesita las características B y C. Nos enfrentaremos a la duplicación de tareas para todas las tareas definidas en A cuando lo importamos. Y creo que declarar sobreescribir verdadero para las tareas definidas en A.gradle sería lo correcto. O debería existir alguna otra solución que desconozco. –

Cuestiones relacionadas