2012-06-22 15 views
10

Cuando se aplica una estructura de múltiples Gradle proyecto para nuestro proyecto, mis settings.gradle se ve así:proyecto de varios Gradle construir con proyectos vacíos

include "source:compA:api" 
include "source:compA:core" 
include "source:compB" 

proyectos Gradle dame

Root project 'tmp' 
\--- Project ':source' 
    +--- Project ':source:compA' 
    | +--- Project ':source:compA:api' 
    | \--- Project ':source:compA:core' 
    \--- Project ':source:compB' 

¡Esta es exactamente la estructura del directorio!
En mi directorio raíz que tienen una build.gradle que se aplica el plugin de Java para todos los subproyectos:

subprojects { 
    apply plugin: 'java' 
} 

Cuando la construcción que acaban de tener artefactos para : Fuente: Compa que están vacías porque se trata de en realidad no es un proyecto, solo los subdirectorios api y core son proyectos propios de Java.

¿Cuál es la mejor manera de evitar tener un artefacto vacío?

+0

¿Por qué no solo aplica el plugin de Java a api y core en sus respectivos scripts? –

+0

Podría hacerlo, pero la estructura real de mi proyecto está mucho más anidada, con muchos proyectos. Creo que este es un problema común para las estructuras de proyectos heredados. Y estoy buscando una solución flexible, donde cada proyecto no necesita saber mucho sobre el proceso de construcción en el que vive. – VolkerK

+0

En mi humilde opinión, el submódulo debería saber explícitamente que se trata de un proyecto de Java. Esto hará que sea mucho más expresivo para cualquiera que lo mire que para declarar esta información en el nivel raíz. –

Respuesta

14

Puedes intentar usar el truco que usan en el archivo Gradle's own settings.gradle. Observe cómo cada uno de los subproyectos se encuentra en la carpeta 'subprojects/${projectName}', pero la carpeta subprojects no es un proyecto.

Así que en su caso se haría algo como:

include "source:compA-api" 
include "source:compA-core" 
include "source:compB" 

project(':source:compA-api').projectDir = new File(settingsDir, 'source/compA/api') 
project(':source:compA-core').projectDir = new File(settingsDir, 'source/compA/core') 

he omitido intencionalmente los dos puntos entre compA y api para asegurarse de que no quede source:compA evaluados como un recipiente proyecto.

Alternativamente, puede intentar excluir el proyecto source:compA de tener el java complemento aplica en ella, haciendo algo como:

def javaProjects() { 
    return subprojects.findAll { it.name != 'compA' } 
} 

configure(javaProjects()) { 
    apply plugin: 'java' 
} 

Editar: alternativa, se puede intentar algo como esto (adaptarse a su gusto):

def javaProjects() { 
    return subprojects.findAll { new File(it.projectDir, "src").exists() } 
} 

configure(javaProjects()) { 
    apply plugin: 'java' 
} 
+0

Gracias por su respuesta. Esperaba algo así como una configuración 'skipIfEmpty'. – VolkerK

+0

Puede lograr algo equivalente a eso personalizando la cláusula 'findAll'. Ver la edición de arriba. – rodion

+0

Esa es una buena solución. Todavía tengo que acostumbrarme al hecho de que los archivos de compilación son guiones maravillosos;) – VolkerK

Cuestiones relacionadas