如何从根项目gradle文件访问子项目gradle文件扩展属性

fv2wmkja  于 2022-11-14  发布在  其他
关注(0)|答案(1)|浏览(227)

我有一个子项目Gradle

project.ext.foo = "bar"
...

我将根项目Gradle文件作为

subprojects {
    if (project.hasProperty("foo")) {
        // not true
    }

    def hasFoo = project.findProperty('foo') ?: ""
    // not finding it

}

我需要根据在单个子项目中设置或未设置的项目,在根gradle文件中配置子项目。
我尝试使用project.properties.each {}转储,但无法发现我正在设置的属性。

cetgtptt

cetgtptt1#

在多项目构建中,Gradle将首先评估和配置根项目,然后配置子项目。
因此,在您的根项目subprojects闭包中,您尝试访问尚未设置的子项目属性,因为子项目尚未配置。
添加一些调试日志有助于了解配置生命周期:

  • 根项目build.gradle*
println("root: start configure phase for root project")

subprojects {
    println("root: configuring subproject $project.name")
    if (project.hasProperty("foo")) {
        println("root: property 'foo' found on subproject $project.name")
    } else {
        println("root: property 'foo' !! NOT !!  found on subproject $project.name")
    }
}

println("root: end configure phase for  root project")
  • 子项目build.gradle *
println("sub-1: start configure phase for subproject $project.name")

println("sub-1: setting foo property")
project.ext.foo = "bar"

println("sub-1: end configure phase for subproject $project.name")

执行结果:

> Configure project :
root: start configure phase for root project
root: configuring subproject sub1
root: property 'foo' !! NOT !!  found on subproject sub1
root: end configure phase for  root project

> Configure project :sub1
sub-1: start configure phase for subproject sub1
sub-1: setting foo property
sub-1: end configure phase for subproject sub1

BUILD SUCCESSFUL in 206ms
溶液

第一个简单的解决方案是在根项目中使用project.afterEvaluate { }特性,以确保在配置依赖于foo属性的内容之前已经配置了子项目:

  • 根项目build.gradle*
subprojects {
    afterEvaluate { 
        println("root: configuring subproject $project.name")
        if (project.hasProperty("foo")) {
            println("root: property 'foo' found on subproject $project.name")
        } else {
            println("root: property 'foo' !! NOT !!  found on subproject $project.name")
        }
    }
}

结果:

> Configure project :
root: start configure phase for root project
root: end configure phase for  root project

> Configure project :sub1
sub-1: start configure phase for subproject sub1
sub-1: setting foo property
sub-1: end configure phase for subproject sub1
root: configuring subproject sub1
root: property 'foo' found on subproject sub1   <<<=== OK !

处理子项目之间的共享配置的更好的解决方案是使用插件:请查看此专用文档

相关问题