【发布时间】:2021-07-30 18:10:13
【问题描述】:
我正在使用 Gradle 6.5.1。根据the Gradle documentation,构建分为三个阶段:初始化、配置和执行。
然而,实际上,事情似乎比这要复杂一些。我在https://github.com/greenrd/evaluation-order 有一个最小的、完整的验证示例 (MCVE)。
在我看来,配置阶段涉及多个子阶段。
问题通过打字重现
gradle clean :client:test --stacktrace
产生大量输出;然而,关键是这些:
Cause 1: org.gradle.internal.resolve.ModuleVersionResolveException: Could not resolve org.typelevel:cats-core_2.12:2.2.0.
Required by:
project :client > org.http4s:http4s-circe_2.12:0.21.8 > org.http4s:http4s-core_2.12:0.21.8
project :client > org.http4s:http4s-circe_2.12:0.21.8 > org.http4s:http4s-core_2.12:0.21.8 > org.typelevel:cats-effect_2.12:2.2.0
Caused by: java.lang.IllegalArgumentException: Configuring the dependency resolve details with 'null' version is not allowed.
我心想,“好吧,它为 null 的原因是因为 scalaExt script plugin 在那个时间点还没有被评估”,所以我在 gradle/magnolia.gradle 的第 1 行取消了这段代码的注释:
//apply from: scalaExt
但我的假设似乎是不正确的,因为它给出了一个不同的错误:
Caused by: org.gradle.api.internal.tasks.DefaultTaskContainer$DuplicateTaskException: Cannot add task 'printAll' as a task with that name already exists.
重要的是,请注意在“Caused by”上方的堆栈跟踪中,出现了未注释的行:
at magnolia_ae70fbynee6mpgv2bzwlr0v6i.run(/home/user/mcve/evaluation-order/gradle/magnolia.gradle:1)
这真的很奇怪。如果只是我误解了 Gradle DSL 的语义并混淆了评估顺序的问题,那么取消注释这行应该修复评估顺序,确保脚本插件足够早地应用.所以这个“DuplicateTaskException”错误不应该在第一次次这样apply from被执行时发生,但如果它发生了,在次次。因为如果是第一次发生,任务怎么可能已经存在?!
因此,在取消注释该行之前的原始项目中,我们似乎处于插件脚本已评估的这种奇怪的中途状态......但它声明的一些变量仍然为空?!这是为什么?我真的很困惑,我找不到或想出任何解释为什么 Gradle DSL 应该以这种奇怪、矛盾的方式表现。一分钟评估顺序是一种方式,然后当您取消注释一行时,评估顺序又是什么?
多项目 Gradle 构建的真正评估顺序是什么?
【问题讨论】: