web-dev-qa-db-fra.com

Gradle multiproject donne l'erreur "Impossible de trouver la propriété 'sourceSets' sur le projet"

J'avais une assez bonne configuration de gradle, qui a tout construit très bien. Mais l'un des projets de ma construction multi-projets dérivait tellement des autres, que je le déplacerais avec plaisir vers un autre dépôt git et configurer des sous-modules pour le gérer.

Tout d'abord, j'ai déplacé Project et ses ressources dans le sous-dossier Libraries/MovedProject. Après avoir modifié certaines lignes dans des configurations dégradées, cela a bien fonctionné. Mais j'ai alors décidé d'écrire un nouveau build.gradle juste pour ce projet, et d'y déplacer toutes les configurations depuis la principale.

Et c'est là que tout a cessé de fonctionner. Lorsque j'essaie d'appeler une tâche, elle se termine toujours par Could not find property 'sourceSets' on project ':Libraries/MovedProject'. La ligne qui en est responsable est:

dependencies {
    ...
    if (noEclipseTask) {
        testCompile project(':Libraries/MovedLibrary').sourceSets.test.output
    }
}

que j'utilise pour exécuter des tests dans lesquels j'utilise des classes d'autres projets. Si je supprime cette ligne, la génération échoue uniquement lorsqu'elle atteint la tâche compileTestJava des projets qui utilisent MovedProject. Si je supprime cette ligne et appelle gradle :Libraries/MovedLibrary:properties Je vois :

...
sourceCompatibility: 1.7
sourceSets: [source set main, source set test]
standardOutputCapture: org.gradle.logging.internal.DefaultLoggingManager@1e263938
...  

tandis que gradle :Libraries/MovedLibrary:build se construit correctement.

Actuellement, j'ai tout configuré comme suit:

  1. répertoires:

    • / SomeMainProject1
    • / SomeMainProject2
    • / SomeMainProject3
    • /Libraries
      • /MovedProject
        • build.gradle
        • dependencies.gradle
        • project.gradle
        • tasks.gradle
    • /Constructeur
      • dependencies.gradle
      • project.gradle
      • tasks.gradle
    • build.gradle
    • settings.gradle
  2. settings.gradle

    include Libraries/MovedProject,
            SomeMainProject1,
            SomeMainProject2,
            SomeMainProject3
    
  3. les ensembles source pour MovedProject sont définis dans Libraries/MovedProject/project.gradle:

    sourceSets {
        main {
            Java {
                srcDir 'src'
                srcDir 'resources'
            }
            resources { srcDir 'resources' }
        }
        test { Java {
            srcDir 'test/unit'
        } }
    }
    
  4. les dépendances qui utilisent sourceSets.test.output sont stockées dans Builder/dependancies.gradle et défini pour chaque projet nécessitant MovedProject pour exécuter des tests:

    project(':SomeMainProject1') {
        dependencies {
            ...
    
            if (noEclipseTask) {
                testCompile project(':Libraries/net.jsdpu').sourceSets.test.output
            }
        }
    }
    

Quelle serait la façon la plus simple de se débarrasser de cette erreur et de créer des projets de construction gradle avec la structure de répertoires actuelle? Je voudrais comprendre pourquoi gradle ne peut pas voir cette propriété.

21
Mateusz Kubuszok

La ligne en question est problématique car elle suppose que le projet :Libraries/MovedLibrary Est évalué (non exécuté) avant le projet en cours, ce qui peut pas le cas. Et si ce n'est pas le cas, les ensembles sources de l'autre projet n'auront pas encore été configurés. (Il n'y aura même pas de propriété sourceSets car le plugin Java-base N'a pas encore été appliqué.)

En général, il est préférable de ne pas tendre la main aux modèles de projet d'autres projets, surtout s'ils ne sont pas des enfants du projet en cours. Dans le cas du projet A utilisant le code de test du projet B, la solution recommandée est que le projet B expose un pot de test (via un bloc artifacts {}) Qui est ensuite consommé par le projet A.

Si vous souhaitez conserver les choses telles qu'elles sont, vous pouvez peut-être contourner le problème en utilisant gradle.projectsEvaluated {} Ou project.evaluationDependsOn(). Voir Gradle Build Language Reference pour plus d'informations.

20
Peter Niederwieser