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

时间:2014-03-03 21:43:34

标签: gradle

我已经设置了一个多模块Gradle构建,里面有几个模块。我正在尝试做的非常简单 - 当我创建一个发行版时,我总是喜欢使用名为“dist / lib”的目录,除了一个项目,它应该只是“dist”。

显而易见的解决方案 - 创建一个名为“distLibDir”的变量,并为相关的特定项目覆盖它,似乎不起作用。

以下是子模块的代码:

project.version = '1.1'

project.ext.distLibDir = 'dist'

dependencies {
....
}

这是顶级项目的代码:

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
    }
}

无论我尝试什么,目录总是出现“dist / lib”,我不能覆盖它只是为了那个模块而不同。有没有人能够洞察这里出了什么问题?

1 个答案:

答案 0 :(得分:5)

默认情况下,在构建子项目的脚本之前,会对父项目的构建脚本进行评估。因此,在您检查其存在时,该属性不存在。

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