Was sind die Unterschiede zwischen Gradle Assemble- und Gradle Build-Aufgaben?

78

Wenn ich mich nicht irre gradle assemble , läuft gradle assembleDebugund gradle assembleRelease, aber ich glaube gradle buildauch das Gleiche, was sind dann die Unterschiede zwischen beiden?

Bescheidener Student
quelle
2
Beim Ausführen buildReleaseerhalte ich nicht die .apkDateien, sondern nur die Protokolldateien. Beim Ausführen bekomme assembleReleaseich jedoch die .apkDateien. Seltsam.
Joshua Pinter

Antworten:

97

Assemble erstellt Ihre Artefakte und Build erstellt Ihre Artefakte mit zusätzlichen Überprüfungen.

buildhängt davon ab assemble, so buildist eine Art Obermenge vonassemble

Mit dem --dry-runFlag können Sie einen Blick auf die Aufgaben werfen, die ausgeführt werden . z.B

gradlew build --dry-run

Sie werden das abgesehen von assembleauch sehen lintund testwerden ausgeführt.

David Medenjak
quelle
3
Danke für die Antwort. Ich glaube, dass das Laufen mit --dry-run der Weg ist, um noch mehr zu verstehen
Humble Student
Was meinst du mit "zusätzlichen Schecks"
Ajay S
3
@ AjayS lintundtest
David Medenjak
2
Nach meiner letzten Erfahrung ist diese Antwort falsch. Wenn ich assembleRelease ausführe, erhalte ich die Ausgabe apk. Wenn ich buildRelease ausführe, wird keine apk generiert. Außerdem führe ich beide Aufgaben mit --dry-run aus, wie oben vorgeschlagen, und es scheint, dass Build nicht Assemble darunter ausgeführt wird.
Rideronthestorm
Ich frage mich, ob das Android-Plugin Build / Assemble anders implementiert als das Java-Plugin. Ich habe gerade eine Antwort auf diese Frage gepostet, die zwei widersprüchliche Diagramme zeigt. Aber einer diskutiert Android und der andere Java.
Colin D Bennett
14

Von gradle tasks --all:

Build tasks
-----------
assemble - Assembles the outputs of this project.
build - Assembles and tests this project.

buildist effektiv assemble+ check(und checkist test+ alle Flusenaufgaben).

Laurence Gonsalves
quelle
13

Es ist wahr, dass gradle taskses so aussieht, als wäre das buildeine Obermenge von assemble, einschließlich Tests. Aber (!) Aus meiner kurzen Erfahrung sieht es wirklich so aus, als wäre das nicht der Fall.

Also habe ich diese beiden Befehle in der Befehlszeile mit dem Gradle-Wrapper mit dem Flag --scan ausgeführt, nachdem ich jedes Mal sauber ausgeführt habe. Dies ist der Vergleich:

  1. Gewünschte erstellte Dateien:
    • Nach dem Ausführen habe assembleDebugich alle erstellten Dateien erhalten - *.apkund *.aarDateien.
    • Nach dem Ausführen hatte buildDebugich keine dieser Dateien.
  2. Anzahl der Aufgaben, die gemäß den Scans ausgeführt wurden:
    • assembleDebug - 109 Aufgaben
    • buildDebug - 91 Aufgaben
  3. Anzahl der Abhängigkeiten gemäß Scan:
    • assembleDebug - 172 aus 20 Konfigurationen
    • buildDebug - 104 aus 18 Konfigurationen
    • Der Grund, warum sie sich unterscheiden, scheint darin zu liegen, dass es in assembleDebug2 meiner 3 Unterprojekte (Java-Bibliotheken, keine App) eine weitere Konfiguration gibt, die aufgerufen wird lintClassPath. Diese Konfiguration fehlt in buildDebug.
  4. Ein weiterer zu erwähnender Punkt ist, dass es bei der Suche in der Aufgabenliste so aussah, als hätte ich buildDebugkeine assembleDebugAufgabe aufgerufen und assembleDebugkeine buildDebugAufgaben aufgerufen .
  5. Und das Letzte Interessante in diesem Zusammenhang ist, dass ich beim Ausführen von build aus Android Studio ( Build -> Make Project) in meinem Scan sehe, dass der tatsächlich ausgeführte Befehl der war assembleDebug. Genauer gesagt lief es :app:assembleDebug.

Wie Sie sehen, verstehe ich die Unterschiede selbst nicht wirklich, aber das habe ich herausgefunden. Wenn jemand es mir und den anderen Benutzern, die hier lesen, erklären kann, könnte es großartig sein :) Danke!

Doron Geh
quelle
7

Es gibt widersprüchliche Informationen darüber, ob builddavon abhängen soll assemble.

Auf der einen Seite zeigt Gradle verstehen: Der Build-Lebenszyklus zeigt eine grafische Darstellung der Aufgabenabhängigkeiten, von denen buildund assembleunabhängig sind: Gezielte azyklische Grafik für die Java-Plug-In-Aufgaben aus dem Buch Gradle Recipes für Android.

Im Gegensatz dazu zeigt das Gradle-Benutzerhandbuch für das Java-Plugin , dass dies zumindest für Java-Projekte von Folgendembuild abhängt assemble:

Java Plugin - Aufgaben

Dies widerspricht der Grafik aus "Gradle verstehen". Vielleicht implementiert das Android-Plugin Build / Assemble-Aufgaben anders als das Java-Plugin? Oder dieses Verhalten hat sich in einer Version von Gradle geändert.

Colin D Bennett
quelle
Der Build hängt sowohl von der Überprüfung als auch von der Montage ab, wie im Code angegeben: github.com/gradle/gradle/blob/…
Henrik Nordvik
0

Assemble erstellt Ihre Artefakte und Build erstellt Ihre Artefakte mit zusätzlichen Überprüfungen.

Welche zusätzlichen Schecks? Ich führe die Aufgaben aus, damit Sie nicht:

:app:lint SKIPPED       
:app:bundleDebugClasses SKIPPED     
:app:kaptGenerateStubsDebugUnitTestKotlin SKIPPED       
:app:kaptDebugUnitTestKotlin SKIPPED        
:app:compileDebugUnitTestKotlin SKIPPED     
:app:preDebugUnitTestBuild SKIPPED      
:app:javaPreCompileDebugUnitTest SKIPPED        
:app:compileDebugUnitTestJavaWithJavac SKIPPED      
:app:processDebugUnitTestJavaRes SKIPPED        
:app:testDebugUnitTest SKIPPED      
:app:bundleReleaseClasses SKIPPED       
:app:kaptGenerateStubsReleaseUnitTestKotlin SKIPPED     
:app:kaptReleaseUnitTestKotlin SKIPPED      
:app:compileReleaseUnitTestKotlin SKIPPED       
:app:preReleaseUnitTestBuild SKIPPED        
:app:javaPreCompileReleaseUnitTest SKIPPED      
:app:compileReleaseUnitTestJavaWithJavac SKIPPED        
:app:processReleaseUnitTestJavaRes SKIPPED      
:app:testReleaseUnitTest SKIPPED        
:app:test SKIPPED       
:app:check SKIPPED      
:app:build SKIPPED

Wie Sie sehen können, werden buildmehr Aufgaben ausgeführt als assemble. Wie lint, testund checkAufgaben.

Sie können die vollständigen Aufgaben hier referenzieren. Der ursprüngliche Text ist eine buildAufgabe, während der geänderte Text eine assembleAufgabe ist.

Verwendetes Projekt: Android Sunflower GitHub

Aldok
quelle