Gradle多项目配置顺序管理

Kas*_*iar 6 gradle build.gradle

编辑: 在 Gradle 源中查看后,此行为似乎是有意为之,并且是通过在任务容器上使用 、 和 方法来触发的getByPathgetByName但显然仅当提供的参数值表示任务名称而不是任务路径时findByPathfindByName也就是说,如果它不表示) t 包含“:”路径分隔符)。

请参阅 此 TaskContainer 实现的链接 ,其中在实际访问项目的任务之前完成调用projectAccessListener.beforeRequestingTaskByPath(project);,以及 此链接到 ProjectAccessListener 实现 ,其中实际评估项目。

我试图更好地了解管理项目配置顺序的可用方法。这些例子有点长,但我觉得有必要设置问题的背景。

设置

假设我们有一个非常基本的设置,包含一个根项目和一个子项目:

master
+--- build.gradle
+--- settings.gradle
+--- lib
 \--- build.gradle
Run Code Online (Sandbox Code Playgroud)

settings.gradle

include 'lib'
rootProject.name = 'master'
Run Code Online (Sandbox Code Playgroud)

build.gradle

println "${project.name} config start"
println "${project.name} config done"
Run Code Online (Sandbox Code Playgroud)

lib/build.gradle

println "${project.name} config start"
println "${project.name} config done"
Run Code Online (Sandbox Code Playgroud)

基本情况

如果我们gradle projects在顶级目录中执行,我们将看到以下评估顺序:

master config start
master config done
lib config start
lib config done
Run Code Online (Sandbox Code Playgroud)

这是预期的,因为 Gradle 文档说项目是按自上而下的顺序配置的:

默认配置顺序是自上而下,这通常是需要的。

评估取决于

有一种记录在案的方法可以通过valuationDependsOn方法更改顺序:

build.gradle

println "${project.name} config start"
evaluationDependsOn(':lib')
println "${project.name} config done"
Run Code Online (Sandbox Code Playgroud)

输出:

master config start
lib config start
lib config done
master config done
Run Code Online (Sandbox Code Playgroud)

因此evaluationDependsOn,基本上加载'lib'构建脚本,配置它,然后恢复主项目配置。

从主项目引用子项目

现在假设我们将一个属性注入到 lib 项目中:

build.gradle

println "${project.name} config start"
project(':lib').ext.flag = true
println "${project.name} config done"
Run Code Online (Sandbox Code Playgroud)

lib/build.gradle

println "${project.name} config start"
println "Property value: ${project.flag}"
println "${project.name} config done"
Run Code Online (Sandbox Code Playgroud)

输出如下:

master config start
master config done
lib config start
Property value: true
lib config done
Run Code Online (Sandbox Code Playgroud)

因此,评估顺序不受project(':lib')主项目内显式引用子项目 ( ) 的影响,并且属性注入成功。

将任务添加到子项目

现在我们将向子项目添加一个任务并从主项目引用它:

build.gradle

println "${project.name} config start"
tasks.getByPath(':lib:action').doLast { println "injected task action" }
println "${project.name} config done"
Run Code Online (Sandbox Code Playgroud)

lib/build.gradle

println "${project.name} config start"
tasks.create('action') {
    println ":lib:action configuration started"
}
println "${project.name} config done"
Run Code Online (Sandbox Code Playgroud)

输出是:

master config start
lib config start
:lib:action configuration started
lib config done
master config done
Run Code Online (Sandbox Code Playgroud)

我们看到评估顺序发生了变化:对子项目任务的访问强制在主配置完成之前对子项目进行完整配置。

问题

现在回答实际问题:

在 Gradle 文档中,我无法找到有关哪些操作和命令更改项目配置顺序的任何完整描述(除了明显的evaluationDependsOnevaluationDependsOnChildren)。有关于这个主题的任何可用信息吗?为什么访问子项目及其属性不会强制其配置,而访问任务却会强制其配置?