无法在多项目构建中覆盖Gradle中的属性

mat*_*vey 5 gradle

我设置了一个多模块Gradle构建,其中包含多个模块。我想做的事情非常简单-创建发行版时,我总是想使用一个名为“ dist / lib”的目录,但有一个项目除外,该项目的目录应该只是“ dist”。

显而易见的解决方案-创建一个名为“ distLibDir”的变量,并针对特定的项目覆盖该变量,似乎无效。

这是子模块的代码:

project.version = '1.1'

project.ext.distLibDir = 'dist'

dependencies {
....
}
Run Code Online (Sandbox Code Playgroud)

这是顶级项目的代码:

subprojects {
    apply plugin: 'java'
    apply plugin: 'eclipse'

    if (! project.hasProperty('distLibDir')) {
        project.ext.distLibDir = 'dist/lib'
    }

    task copyLib(type: Copy) {
        into project.distLibDir
        from configurations.runtime
    }

    task dist(type: Copy, dependsOn: [clean, jar, copyLib]) {
        from 'build/libs'
        into project.distLibDir
    }
}
Run Code Online (Sandbox Code Playgroud)

不管我尝试什么,该目录始终显示为“ dist / lib”,并且我无法覆盖该目录以使该模块与众不同。有谁洞悉这里出了什么问题?

Pet*_*ser 5

默认情况下,在评估子项目的构建脚本之前先评估父项目的构建脚本。因此,在检查属性是否存在时该属性不存在。

有几种解决方案。一种方法是suprojects根据当前项目的名称或路径(例如if (project.path == ":foo") {...} else {...})在父脚本的块中设置属性的值。另一个方法是将subprojects块的主体(或至少使用该属性的部分)移动到脚本插件中,并从每个构建脚本(例如apply from: "$rootDir/gradle/foo.gradle")中应用该插件。这使您有机会在应用脚本插件之前设置属性的值。另一个解决方案(我个人试图避免)是保持原样并evaluationDependsOnChildren()在从父构建脚本访问属性之前调用它。