2017-11-30 9 views
0

Ich habe ein Problem mit einem benutzerdefinierten gradle Aufgabe: ich möchte meine android jar Bibliothek und benennen Sie sie kopieren nach, dass es eine ‚saubere bauen‘, wie ausgeführt Hier ist, wie ich es definiert:Gradle Aufgabe der Reihenfolge ihrer Abhängigkeit

task('CreateJar', type: Copy, dependsOn: [':mylibmodule:clean', ':mylibmodule:build']){ 
    doLast { 
    from('build/intermediates/bundles/release/') 
    into('libs') 
    include('classes.jar') 
    rename('classes.jar', 'MyLib.jar') 
    } 
} 

das Problem ist, dass in den gradle log Ergebnisse, die ‚saubere‘ nach der ‚bauen‘ Aufgabe erledigt ist, so dass die lib nie in den Zielordner kopiert wird:

... 
:mylibmodule:testReleaseUnitTest 
:mylibmodule:test 
:mylibmodule:check 
:mylibmodule:build 
:mylibmodule:clean 
:mylibmodule:CreateJar NO-SOURCE 

ich auch versucht haben, um die Reihenfolge der Aufgaben im 'dependsOn: []' zu ändern, aber es ändert sich nichts ing ... Hat jemand eine Ahnung wo mein Fehler ist? Vielen Dank im Voraus

+0

Warum hängt die Erstellung eines Glases von der Reinigung ab? –

+0

Es könnte eine alte schlechte Angewohnheit sein, wenn ich in C kodierte, um immer vor dem Aufbau zu reinigen. Der Build erstellt ein aar, aber ich brauche nur das im intermediate-Build-Verzeichnis erstellte jar. Die CreateJar-Aufgabe ist mehr eine automatische Kopie, die ich während des Builds im Zielverzeichnis erstellen möchte. – Snorky35

Antwort

1

Die dependsOn Liste enthält keine Bestellgarantien. In der Regel wird zuerst ausgeführt, was zuerst aufgeführt ist, wenn es keine anderen Beziehungen gibt, die Bestellgarantien auferlegen.

(Ein Beispiel ist, wenn clean auf build abhängt, dann spielt es keine Rolle, wie Sie es in diesem dependsOn Attribute definieren, becuase build immer vor clean ausgeführt werden. Dass dies nicht der Fall ist, ist mir klar, so in Klammern, nur um zu verdeutlichen, was ich meine.)

Um festzustellen, warum schließlich build vor clean läuft, kann ich nicht sagen, ohne das vollständige Build-Skript zu sehen. Von dem was du gepostet hast ist es nicht bestimmbar.

Vielleicht, was Sie suchen, ist oder clean.mustRunAfter build, die eine Reihenfolge Einschränkung definieren, ohne eine Abhängigkeit hinzuzufügen. Sie können also jede Aufgabe einzeln ausführen, aber wenn beide ausgeführt werden, wird ihre Reihenfolge so definiert, wie Sie sie angegeben haben. Der Unterschied zwischen diesen beiden ist nur dann relevant, wenn die parallelisierte Task-Ausführung danach ausgeführt werden soll, dass sie parallel laufen könnten, run muss danach nicht laufen.

+0

Vielen Dank für Ihre Antwort. Ich war mir nicht sicher für die "Bestellgarantien". Tatsächlich werden "clean" und "build" Aufgaben automatisch vom android-gradle Plugin verwaltet, so dass ich ihr Verhalten nicht ändern kann. Ich werde es analysieren müssen, es wird verwaltet und vielleicht muss ich versuchen es zu machen ein anderer Weg – Snorky35

+1

Sicher kannst du. Sie können jede gewünschte Aufgabe ändern. Wenn Sie ein 'dependsOn' oder ein' shouldRunAfter' oder was auch immer hinzufügen möchten, können Sie es einfach ohne Probleme machen. Durch das Anwenden des Plugins werden die Aufgaben hinzugefügt und konfiguriert, und Sie können sie anschließend in Ihrem Build-Skript frei ändern. – Vampire

Verwandte Themen