2012-06-22 4 views
10

Lors de l'application d'une structure gradle multi projet à notre projet, mes settings.gradle ressemble à ceci:Gradle projet de plusieurs construire des projets vides

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

projets Gradle me donner

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

C'est exactement la structure du répertoire!
Dans mon répertoire racine J'ai un build.gradle qui applique le plugin java à tous les sous-projets:

subprojects { 
    apply plugin: 'java' 
} 

Lors de la construction, je finis par avoir des artefacts pour : source: Compa qui sont vides parce que c'est en fait pas un projet seulement les sous-répertoires api et core sont des projets java propres.

Quel est le meilleur moyen d'éviter d'avoir un artefact vide?

+0

Pourquoi n'appliquez-vous pas simplement le plugin Java à api et core dans leurs scripts respectifs? –

+0

Je pourrais le faire, mais ma structure de projet actuelle est beaucoup plus imbriquée, avec beaucoup de projets. Je pense que c'est un problème courant pour les structures de projet héritées. Et je cherche une solution flexible, où chaque projet n'a pas besoin d'en savoir beaucoup sur le processus de construction dans lequel il vit. – VolkerK

+0

IMHO le sous-module doit explicitement savoir qu'il s'agit d'un projet Java. Cela le rendra beaucoup plus expressif pour quiconque le regarde que de déclarer cette information au niveau de la racine. –

Répondre

14

Vous pouvez essayer d'utiliser l'astuce qu'ils utilisent dans le fichier Gradle's own settings.gradle. Notez comment chacun des sous-projets se trouvent dans le dossier 'subprojects/${projectName}', mais le dossier subprojects lui-même n'est pas un projet.

Donc, dans votre cas, vous feriez quelque chose comme:

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') 

J'ai volontairement omis le côlon entre compA et api pour vous assurer que source:compA ne soit pas évalué comme un conteneur de projet.

Alternativement, vous pouvez essayer à l'exclusion du projet source:compA d'avoir le plugin java appliquée, en faisant quelque chose comme:

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

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

Edit: Sinon, vous pouvez essayer quelque chose comme ça (s'adapter à votre aimer):

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

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

Merci pour votre réponse. J'espérais quelque chose comme un paramètre 'skipIfEmpty'. – VolkerK

+0

Vous pouvez réaliser quelque chose d'équivalent en personnalisant la clause 'findAll'. Voir la modification ci-dessus. – rodion

+0

C'est une bonne solution. Je dois encore m'habituer au fait que les buildfiles sont des scripts groovy;) – VolkerK

Questions connexes