1
votes

Pourquoi classer les dépendances de résolution dans l'ordre des noms de module par défaut?

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


0 commentaires

3 Réponses :


0
votes

Essayez de mettre ceci dans le build.gradle

preBuild.dependsOn ":bmodule:build"

de votre amdoule


1 commentaires

obtenant toujours une erreur "Impossible d'obtenir la propriété inconnue" intTest "pour le conteneur SourceSet de type org.gradle.api.internal.tasks.DefaultSourceSetContainer."



0
votes

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.


0 commentaires

0
votes

Gradle a trois phases de construction:

  • Initialisation
  • Configuration
  • Exécution

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
}


0 commentaires