2012-10-02 10 views
5

Tengo una tarea que genera fuentes Java y un conjunto de jarras de estas fuentes (por ejemplo, proyecto a). Me gustaría exportar estas jarras a proyectos dependientes (por ejemplo, proyecto b). Así que aquí es más o menos lo que tengo en este momento:Gradle: ¿puedo incluir la salida de la tarea en dependencias del proyecto?

//a.gradle 

configurations{ 
    generatedJars 
} 

task generateJars(type: JavaExec) { 
    //generate jars ... 

    outputs.files += //append generated jars here 
} 

dependencies{ 
    generatedJars generateJars.outputs.files 
} 


//b.gradle 

dependencies{ 
    project(path: ':a', configuration: 'generatedJars') 
} 

Funciona bien, excepto que la adición de generateJars.outputs.files como una dependencia no le dice a Gradle que tiene que ejecutar generateJars tarea cuando no hay frascos generados todavía. He intentado agregar la tarea como una dependencia con la esperanza de que funcione de la misma manera que cuando se agrega una tarea jar/zip a una configuración de artefacto (por ejemplo, artifacts{ myJarTask }), pero arroja un error diciéndome que no puedo hacer ese. Por supuesto, puedo inyectar la tarea generateJars en algún lugar del proceso de compilación antes de que :b empiece a evaluar, pero eso es torpe y frágil, por lo que me gustaría evitarlo.

Siento que debería agregar los archivos jar generados a artifacts{ ... } del proyecto, pero no estoy seguro de cómo hacerlos visibles para los proyectos dependientes. ¿Hay una mejor manera de lograr esto?

Los proyectos dependientes (proyecto b) necesitarán configurar el classpath del módulo IDEA de IntelliJ para apuntar a los archivos jar generados del proyecto a. Algo más bien como este (pseudo-código):

//b.gradle 

idea{ 
    module{ 
    scopes.COMPILE.plus += project(path: ':a', configuration: 'generatedJars').files 
    } 
} 

Hasta ahora he intentado simplemente añadiendo un dependecy proyecto sobre :a 's generatedJars en :b, pero plug-in Idea simplemente añade módulo :a como un módulo de dependencia y asume que exporta sus jar generados (que probablemente sea una suposición correcta), por lo tanto, no agrega los jar generados al classpath de :b.

¡Cualquier ayuda sería muy apreciada!

Respuesta

2

Primero, ¿necesita una configuración separada? Es decir, ¿tiene clientes de a que deberían no ver los Tarros generados? De lo contrario, puede agregar los Jars generados a la configuración archives, lo que simplificará las cosas.

En segundo lugar, la forma correcta de añadir los tarros generados a la configuración es (en lugar del bloque dependencies):

artifacts { 
    generatedJars generateJars 
} 

Esto debe asegurarse de que la tarea generateJars se ejecute automáticamente cuando sea necesario.

En tercer lugar, omitiría += después de outputs.files, aunque podría no hacer la diferencia. También debe agregar las entradas necesarias.

En cuarto lugar, ¿por qué necesita una tarea JavaExec para generar los tarros? ¿Puedes agregar las fuentes generadas a un conjunto fuente y dejar que Gradle las cree?

En quinto lugar, IDEA no tiene un concepto correspondiente a las dependencias de configuración del proyecto de Gradle. O bien un módulo IDEA depende completamente de otro módulo, o no funciona en absoluto. Tiene dos opciones: usar una dependencia de módulo y hacer que las fuentes generadas sean una carpeta fuente del módulo dependiente (preferiblemente tanto en la compilación de Gradle como IDEA), o pasar los Jars generados como dependencias externas a IDEA.En cualquier caso, probablemente debería agregar una dependencia de tarea de ideaModule a la tarea de generación apropiada. Si esto todavía no conduce a una configuración de IDEA satisfactoria, podría pensar en mover la generación de los Jars en un subproyecto separado.

+0

Gracias. Agregar la tarea a 'artifacts' funciona bien dentro del módulo, pero no veo cómo puedo hacer referencia a esos archivos jar del proyecto' b' (sin publicarlos). Sí, es posible generar solo fuentes y exportarlas como fuente del módulo. Esto debería funcionar, pero crea trabajo adicional para IDEA, así que esperaba que se pudiera eludir de alguna manera. Para que el enganche 'ideaModule -> generateJars' funcione bien, también necesito agregar' b: ideaModule -> a: ideaModule', y tengo alrededor de 3 módulos que necesitan hacer esto. Esperaba poder configurarlo para una resolución automática de alguna manera. – rodion

+0

anuncio 1. 'proyecto (ruta: 'a', configuración: 'generatedJars')' –

+0

anuncio 2. ¿Importa el "trabajo extra"? (Podría usar el mismo argumento para el código no generado.) En cualquier caso, probablemente debería compilar los archivos con Gradle en lugar de una tarea JavaExec. –

Cuestiones relacionadas