J'ai trois modules:
amodule
bmodule
cmodule
Il y a des tests d'intégration dans chacun de ces trois modules. Le bmodule
est la base - il contient BaseClass
, que je souhaite utiliser dans les tests d'intégration dans amodule
et cmodule code >
L'exemple de mon projet est sur github: https://github.com / ljql / test-deps
J'essaye d'ajouter une dépendance aux tests d'intégration de bmodule
dans amodule
et cmodule .
Le fichier
build.gradle
a le même aspect dans les modules amodule
et cmodule
Build file '/test-deps/amodule/build.gradle' line: 10 A problem occurred evaluating project ':amodule'. > Could not get unknown property 'intTest' for SourceSet container of type org.gradle.api.internal.tasks.DefaultSourceSetContainer.
Mais quand J'essaye de construire un module
J'ai une erreur:
sourceSets { intTest { java { srcDir 'src/test-integration/java' } resources { srcDir 'src/test-integration/resources' } compileClasspath += rootProject.project('bmodule').sourceSets.intTest.output runtimeClasspath += rootProject.project('bmodule').sourceSets.intTest.output } } configurations { intTestCompile { extendsFrom compile } intTestRuntime { extendsFrom runtime } } dependencies { intTestCompile project(path: ':bmodule', configuration: 'intTestCompile') }
La construction de cmodule
, qui est la copie de amodule
, est terminé avec succès.
La seule différence entre amodule
et cmodule
réside dans leurs noms. Le module
précède le bmodule
et le cmodule
suivi du bmodule
Comment puis-je spécifier une séquence de dépendances de résolution progressive dans mon cas? Je veux que Gradle découvre d'abord le bmodule
, puis le amodule
et le cmodule
3 Réponses :
Essayez de mettre ceci dans le build.gradle
preBuild.dependsOn ":bmodule:build"
de votre amdoule
obtenant toujours une erreur "Impossible d'obtenir la propriété inconnue" intTest "pour le conteneur SourceSet de type org.gradle.api.internal.tasks.DefaultSourceSetContainer."
Vous avez un problème de commande d'évaluation de projet. Puisque amodule
et cmodule
s'attendent à trouver des composants spécifiques de bmodule
, vous devez demander à Gradle de vous assurer que bmodule
a été évalué en premier.
Vous pouvez ajouter dans les fichiers de construction de amodule
et cmodule
ce qui suit:
evaluationDependsOn(':bmodule')
Bien que Gradle propose une API pour résoudre ce problème, cela ne fonctionnera que si vous n'avez pas de cycle, c'est-à-dire que bmodule
n'a pas de dépendances sur amodule
ou cmodule , sinon vous ne pourrez pas trouver de solution de cette façon.
Une autre approche consisterait à tirer parti d'une résolution de dépendance appropriée et à déclarer que vous voulez partager certaines classes de test en les ayant exposé comme test-fixtures par exemple.
Gradle a trois phases de construction:
Mais le résultat final de la résolution de toutes les dépendances n'apparaît que lorsque gradle termine les trois phases.
L'erreur indique une chaîne dans sourceSets - elle provient de la phase Configuration. Au début de cette phase, gradle ne sait rien des configurations de tous les modules. Et gradle apprend le contenu de chaque module séquentiellement module par module. Bien sûr, lorsque gradle considère la configuration de l ' amodule
pour la première fois, il ne sait rien des configurations dans le bmudule
.
Dans la question que je veux définir compileClasspath et runtimeClasspath dans la configuration : amodule: intTest
. Mais rien ne m'empêche de le définir dans une tâche personnalisée. Gradle l'exécutera à la troisième phase et le compileClasspath final et le runtimeClasspath contiendront les informations du bmodule:intTest
Le résultat build.gradle de amodule code >:
sourceSets { intTest { java { srcDir 'src/test-integration/java' } resources { srcDir 'src/test-integration/resources' } } } configurations { intTestCompile { extendsFrom compile } intTestRuntime { extendsFrom runtime } } task intTest { sourceSets.intTest.compileClasspath += rootProject.project('bmodule').sourceSets.intTest.output sourceSets.intTest.runtimeClasspath += rootProject.project('bmodule').sourceSets.intTest.output }