梯级装配和梯级构建任务有什么区别?

如果我没有错的话,gradle assemble确实运行 gradle assembleDebuggradle assembleRelease,但我相信 gradle build也做同样的事情,那么它们之间有什么不同呢?

79689 次浏览

assemble将构建您的工件,而 build将使用额外的检查来组装您的工件。

build依赖于 assemble,所以 buildassemble的超集

您可以通过使用 --dry-run标志查看将要执行的任务。

gradlew build --dry-run

您将看到,除了 assemble之外,还将执行 linttest

来自 gradle tasks --all:

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

build实际上是 assemble + check(而 checktest + 任何衬布任务)。

的确,根据 gradle tasks,看起来 buildassemble的超集,包括测试。 但是,从我短暂的经验来看,事实并非如此。

因此,每次运行干净之后,我使用带有—— scanner 标志的 gradle 包装器在命令行中运行这两个命令。 这是一个比较:

  1. 所需的内置文件:
    • 在运行 assembleDebug之后,我得到了所有我想要的构建文件—— *.apk*.aar文件。
    • 在运行 buildDebug之后,我没有任何这些文件。
  2. 根据扫描运行的任务数量:
    • assembleDebug-109任务
    • buildDebug-91任务
  3. 根据扫描的依赖项数量:
    • 从20个配置 assembleDebug-172
    • 来自18个配置的 buildDebug-104
    • 它们之所以不同,似乎是因为在我的3个子项目(Java 库,而不是应用程序)中的2个 assembleDebug中,还有另外一个配置,称为 lintClassPathbuildDebug中缺少此配置。
  4. 另一点值得一提的是,当我在任务列表中搜索时,似乎 buildDebug没有调用 assembleDebug任务,而 assembleDebug也没有调用 buildDebug任务。
  5. 在这个上下文中要提到的最后一件有趣的事情是,当我从 Android Studio (Build -> Make Project)运行 build 时,我在扫描中看到实际运行的命令是 assembleDebug。更确切地说,它运行 :app:assembleDebug

如你所见,我自己也不是很明白其中的区别,但这是我发现的。如果有人能给我和其他读者解释一下,那就太棒了:) 谢谢!

关于 build是否应该依赖于 assemble,存在着相互矛盾的信息。

一方面,理解分级: 构建生命周期显示了 buildassemble相互独立的任务依赖关系图: Directed acyclic graph for the Java plug-in tasks from the book Gradle Recipes for Android.

相比之下,Java 插件用户指南表明 build依赖于 assemble,至少对于 Java 项目来说是这样:

Java plugin - tasks

这与《理解格拉德尔》中的图表相矛盾因此,也许 Android 插件实现的构建/组装任务与 Java 插件不同?或者,这种行为在某种程度上改变了 Gradle。

组装将构建您的工件,构建将使用附加检查组装您的工件。

什么额外的检查? 我运行任务,所以你不必:

: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执行更多的任务,比如 linttestcheck任务。

您可以在这里引用 < a href = “ https://www.effchecker.com/lCjyhv5k”rel = “ nofollow noReferrer”> full task 原始文本为 build任务,而更改后的文本为 assemble任务。

项目使用: Android Sunflower GitHub

有一个很棒的插件,可视化任务之间的依赖关系:

Https://plugins.gradle.org/plugin/org.barfuin.gradle.taskinfo

将它添加到项目后运行,例如 ./gradlew tiTree build

本文中的更多内容: https://tomgregory.com/all-about-the-gradle-task-graph/