Якщо я не помиляюся gradle assemble, працює gradle assembleDebugі gradle assembleRelease, але я вважаю, що gradle buildробить те саме, то чим вони між собою відрізняються?
Якщо я не помиляюся gradle assemble, працює gradle assembleDebugі gradle assembleRelease, але я вважаю, що gradle buildробить те саме, то чим вони між собою відрізняються?
Відповіді:
Assemble створить ваші артефакти, а build - збере ваші артефакти за допомогою додаткових перевірок.
buildзалежить від assemble, тому buildє свого роду надмножиноюassemble
Ви можете поглянути на завдання, які будуть виконані за допомогою --dry-runпрапора. напр
gradlew build --dry-run
Ви побачите, що крім assembleтакож lintі testбуде виконано.
lintandtest
Від gradle tasks --all:
Build tasks
-----------
assemble - Assembles the outputs of this project.
build - Assembles and tests this project.
buildє ефективно assemble+ check(і checkє test+ будь-якими завданнями зв’язування).
Це правда, що, згідно з gradle tasksним, виглядає як buildнадмножина assemble, включаючи тести. Але (!) З мого короткого досвіду справді здається, що це не так.
Тож я запустив ці 2 команди в командному рядку, використовуючи оболонку gradle з прапором --scan після кожного запуску чистої роботи. Ось порівняння:
assembleDebugя отримав усі вбудовані файли, які хотів - *.apkі *.aarфайли.buildDebugя не мав жодного з цих файлів.assembleDebug - 109 завданьbuildDebug - 91 завданняassembleDebug - 172 з 20 конфігураційbuildDebug - 104 з 18 конфігураційassembleDebug2 з 3 моїх підпроектів (які є бібліотеками Java, а не додатком) є ще одна конфігурація, яка називається lintClassPath. Ця конфігурація відсутня в buildDebug.buildDebugщо не викликав assembleDebugзавдання і assembleDebugне викликав buildDebugзавдання.Build -> Make Project), я бачу під час сканування, що команда, яка насправді виконувалася, була assembleDebug. Точніше, він пробіг :app:assembleDebug.Як бачите, я сам насправді не розумію відмінностей, але це я дізнався. Якщо хтось може пояснити це мені та іншим користувачам, які читають тут, це може бути чудово :) Дякую!
Існує суперечлива інформація про те, чи buildмає це залежати assemble.
З одного боку, Розуміння Gradle: Життєвий цикл збірки показує графік залежностей завдань, звідки buildі assembleє незалежними:

На відміну від цього, посібник користувача Gradle для плагіна Java показує, що buildзалежить assemble, принаймні, для проектів Java:
Це суперечить графіку "Розуміння Gradle". То, можливо, плагін Android реалізує завдання збірки / збірки не так, як плагін Java? Або ця поведінка змінилася в якійсь версії Gradle.
Assemble створить ваші артефакти, а build - збере ваші артефакти за допомогою додаткових перевірок.
Які додаткові перевірки? Я запускаю завдання, щоб вам не потрібно було:
: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
Як бачите, buildвиконує більше завдань, ніж assemble. Мовляв lint, testі checkзавдання.
Повні завдання можна переглянути тут
. Оригінальний текст є buildзавданням, тоді як змінений текст єassemble завдання.
Використовуваний проект: Android Sunflower GitHub
buildReleaseя не отримую.apkфайли, а лише файли журналів. Тим НЕ менше, при роботіassembleRelease, я робити отримати.apkфайли. Непарні