修改
在Gradle源中查看此行为似乎是预期的,并且通过在任务容器上使用getByPath
,getByName
,findByPath
和findByName
方法触发,但显然仅在提供的参数时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文档说项目是按照自上而下的顺序配置的:
默认配置顺序是自上而下的,通常是需要的。
通过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文档中,我无法找到有关哪些操作和命令更改项目配置顺序的详细说明(除了显而易见的evaluationDependsOn
和evaluationDependsOnChildren
)。
有关于此主题的可用信息吗?为什么访问子项目及其属性不会强制配置,而访问任务呢?