2011-07-30 10 views
6

Estoy intentando crear una tarea Zip que crearía un paquete de distribución para mi proyecto que contiene archivos jar y war del proyecto (y potencialmente otros artefactos creados por la tarea assemble).Cómo crear un archivo de distribución (zip) que contenga los archivos de proyecto y guerra en Gradle

así que traté de escribir este guión sencillo

task dist(dependsOn: 'assemble', type: Zip){ 
    into('lib'){ 
    from 'build/libs' //contains jar and war files 
    } 
    ... //other stuff 
} 

Tarea dist depende de assemble ya que convenientemente incluye las tareas que crean archivos jar y de guerra.

Pero si trato de ejecutar que, Gradle se queja con este mensaje de error:

Circular dependency between tasks. Cycle includes [task ':assemble', task ':dist']. 

He comprobado el specification for assemble task, y que está claramente escrito que assemble tarea de forma automática dependsOn todas las tareas de archivo en el proyecto , que obviamente incluye mi tarea dist. Y parece que no hay forma de evitarlo.

¿Cuál sería el correcto forma de hacerlo en gradle? ¿Cómo puedo hacer una tarea zip que depende de la tarea assemble? Podría hacer que la tarea dist dependa explícitamente de las tareas jar y war, pero creo que eso viola un poco la encapsulación.

Estoy usando gradle-1.0-milestone-3.

¡Gracias de antemano!

Respuesta

11

aquí es un ejemplo completo a depender Zip en el frasco y la tarea de la guerra:

task dist(type:Zip){ 
    from jar.outputs.files 
    from war.outputs.files 
} 
+0

Gracias. Se ve bien, pero ¿no incluiría también el contenido de todas las tareas Jar en mi zip? (Lo intentaré más tarde cuando llegue a casa). Originalmente, lo que quería era crear un paquete de distribución que contenga salidas de tareas 'jar' y' war' * solo *. Su solución debería ser la solución por el momento, pero si añadiera algunas tareas de jar auxiliares, más adelante parecería que terminarían en mi zip. – rodion

+0

lo siento, pensé que te refieres a todas las tareas de tipo Jar y War. Reformé la muestra anterior para adaptarla a sus necesidades. Espero que nos acerquemos a una solución adecuada :-) –

+0

Funciona perfectamente, gracias! – rodion

0

Puede hacer lo siguiente para obtener todos los archivos creados de una acumulación en su dist postal:

task dist(type:Zip){ 
    tasks.withType(AbstractArchiveTask).each{ archiveTask -> 
     if(archiveTask!=dist){ 
      from archiveTask.outputs.files 
     } 
    } 
} 
+0

Buena idea, pero bastante prolija. También se rompería si tuviera otra tarea 'dist2' similar. – rodion

+0

¿podría explicar qué se rompería con una segunda tarea de dist2? la cláusula if solo es necesaria para evitar un ciclo. –

+0

Quise decir que si tuviera otra tarea de distribución ('dist2') sus archivos de salida se incluirían en' dist', mientras que solo quiero la salida de 'assemble' (es decir' jar' y 'war'). De hecho, el contenido de 'archiveTask.outputs.files' no es tan importante para mí. Solo quiero asegurarme de que las tareas 'jar' y' war' se ejecuten antes de la tarea 'dist'. – rodion

Cuestiones relacionadas