【问题标题】:Evaluation order of Gradle multi-project buildGradle 多项目构建的评估顺序
【发布时间】: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 构建的真正评估顺序是什么?

【问题讨论】:

    标签: gradle semantics


    【解决方案1】:

    这只是一个错字。 cats_v 应该是 cats_core_v

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-11
      • 2020-03-03
      • 1970-01-01
      • 2021-10-07
      • 2015-04-26
      • 2011-04-07
      • 1970-01-01
      相关资源
      最近更新 更多