2017-01-20 6 views
2

Eine kleine Frage darüber, wie Gradle (Version 3.3) Aufgabenabhängigkeiten in einer Multiprojekteinstellung (mit Java-Unterprojekten) löst. Ich bin ziemlich neu zu grandle, also vielleicht ist es eine dumme Frage ...Gradle dependson vs defaultTasks in Multiprojekt

Ich möchte erreichen, dass eine Aufgabe vor der Kompilierung und eine nach der Kompilierung ausgeführt wird.

Mit DefaultTasks funktioniert es wie erwartet. Aber beim Definieren einer Aufgabe mit dependsOn tut es nicht.

Meine Wurzel build.gradle Datei wie folgt aussieht:

defaultTasks 'a', 'classes', 'b' 

task a { 
    doLast { 
     println 'before compile' 
    } 
} 

task b { 
    doLast { 
     println 'after compile' 
    } 
} 

task doIt(dependsOn: [a, 'classes', b]) { 
    doLast { 
     println('done!') 
    } 
} 

allprojects { 
    group = 'foo' 

    repositories { 
     mavenCentral() 
     maven { 
      url 'https://maven.atlassian.com/3rdparty/' 
     } 
    } 
} 

subprojects { 
    ext { 
     springVersion = '4.3.5.RELEASE' 
    } 
    apply plugin: 'java' 
    dependencies { 
     compile fileTree(dir: 'lib', include: '*.jar') 
     testCompile group: 'junit', name: 'junit', version: '4.12' 
    } 
} 

Wenn ich ausführen gradle die Standardaufgaben ausgeführt werden, wie erwartet: I „vor kompilieren“ erhalten, dann werden alle Teilprojekte kompiliert werden, dann „nach der Kompilierung“.

Wenn ich gradle doIt ausführen bekomme ich folgende Fehlermeldung

Task with path 'classes' not found in root project 'teambits-core'. 

Jede Idee, warum dies der Fall ist?

Antwort

1

Mit Ihrer build.gradle, wie es ist, führt nur "Gradle" den gleichen Fehler auf meiner 3.3 Installation.

Es gibt 2 Probleme, denen Sie hier gegenüberstehen.

1. Multiteilprojekte vs allprojects

Das erste Problem ist, dass die defaultTasks im Haupt build.gradle aber Ihr Java-Plugin nur in Teilprojekte enthalten ist, definiert ist.

In einem Multiprojekt-Build ist das 'Master'-Projekt nicht Teil des Teilprojekts (nur alle Projekte betreffen das Master-Projekt), aber Ihre' DefaultTasks 'sind auf der obersten Ebene definiert, also läuft' grdle ' Rufen Sie die DefaultTasks im Master-Projekt auf und schlagen Sie bei der Klassenaufgabe fehl, weil das Java-Plugin nicht geladen wird.

Um dies zu beheben, verschieben Sie die Zeile 'apply plugin' auf alle Projekte (aber nur für diese Abbildung, normalerweise wollen Sie nicht, dass das Java-Plugin in Master geladen wird, da es generell um das Einrichten der Unterprojekte geht).

2. defaultTasks vs DependsOn

Das zweite Problem ist (vorausgesetzt, bewegen Sie das Plugin anwenden), dann werden Sie den Unterschied zwischen defaultTasks und DependsOn getroffen.

Die defaultTasks läuft die Aufgaben in der von Ihnen angegebenen Reihenfolge:

$ gradle 
:a 
before compile 
:compileJava UP-TO-DATE 
:processResources UP-TO-DATE 
:classes UP-TO-DATE 
:b 
after compile 

BUILD SUCCESSFUL 

Total time: 0.765 secs 

Aber läuft doIt mit der Liste, um verursachen gradle sie in alphabetischer Reihenfolge ausgeführt werden (da es keine Abhängigkeiten zwischen ihnen sind und in solchen Szenarien es wird sie alphabetisch laufen lassen).

$ gradle doit 
:a 
before compile 
:b 
after compile 
:compileJava UP-TO-DATE 
:processResources UP-TO-DATE 
:classes UP-TO-DATE 
:doIt 
done! 

BUILD SUCCESSFUL 

Total time: 0.733 secs 

Fix Abhängigkeit Ordnung mit mustRunAfter

In diesem Fall können Sie das Problem beheben, indem Sie das folgende doIt:

task doIt(dependsOn: [a, 'classes', b]) { 
    b.mustRunAfter(':classes') 
    doLast { 
     println('done!') 
    } 
} 

, die die b Aufgabe zwingen wird, die später durchgeführt werden .

+0

Danke für die ausführliche Antwort, Mark! Vor allem der .mustRunAfter war sehr hilfreich. – Axel

+0

@Axel - froh, ich könnte helfen. Ich habe deine Frage tatsächlich gefunden, weil ich ein ähnliches Problem hatte, und bei der Lösung meines Problems löste es auch dein Problem. –

+0

Das ist eine dieser Win-Win-Situationen :-) – Axel

Verwandte Themen