Gradle多项目配置订单管理

时间:2018-04-09 14:59:59

标签: gradle build.gradle

修改 在Gradle源中查看此行为似乎是预期的,并且通过在任务容器上使用getByPathgetByNamefindByPathfindByName方法触发,但显然仅在提供的参数时value表示任务名称而不是任务路径(即,如果它不包含':'路径分隔符)。

请参阅 this link to TaskContainer implementation 在实际访问项目任务之前调用projectAccessListener.beforeRequestingTaskByPath(project);的地方, 并且 this link to ProjectAccessListener implementation 实际评估项目的地方。

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

设置

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

master
+--- build.gradle
+--- settings.gradle
+--- lib
 \--- build.gradle

settings.gradle

include 'lib'
rootProject.name = 'master'

build.gradle

println "${project.name} config start"
println "${project.name} config done"

lib/build.gradle

println "${project.name} config start"
println "${project.name} config done"

基本案例

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

master config start
master config done
lib config start
lib config done

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

  

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

evaluationDependsOn

通过evaluateDependsOn方法更改订单的文档记录方法:

build.gradle

println "${project.name} config start"
evaluationDependsOn(':lib')
println "${project.name} config done"

输出:

master config start
lib config start
lib config done
master config done

所以evaluationDependsOn基本上加载'lib'构建脚本,对其进行配置,然后恢复主项目配置。

从主站

引用子项目

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

build.gradle

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

lib/build.gradle

println "${project.name} config start"
println "Property value: ${project.flag}"
println "${project.name} config done"

输出如下:

master config start
master config done
lib config start
Property value: true
lib config done

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

将任务添加到子项目

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

build.gradle

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

lib/build.gradle

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

输出结果为:

master config start
lib config start
:lib:action configuration started
lib config done
master config done

我们看到评估顺序已更改:在完成主配置之前,对子项目任务的访问强制完成子项目的配置。

问题

现在回答实际问题:

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

0 个答案:

没有答案