Gradle:如何覆盖子项目中的变量?

时间:2019-11-20 21:45:50

标签: gradle

我定义使用在根项目的build.gradle中包含一个变量的字符串,并且我想在不同子项目的build.gradle s中以不同的方式定义该变量的值。

build.gradle

ext {
    diet4jActivationClass = 'xxx'
}
subprojects {
    ...
    publishing {
        publications {
            maven(MavenPublication) {
                from(components.java)

                pom {
                    properties = [
                        'diet4j.activationclass': "${diet4jActivationClass}"
                    ]
                }
            }
        }
    }
}

子项目的build.gradle

ext {
    diet4jActivationClass = 'yyy'
}

POM属性始终使用值xxx生成,而永远不会使用yyy生成。我该怎么做?

1 个答案:

答案 0 :(得分:1)

默认情况下,根项目将先于子项目进行评估。因此,根项目中的subprojects {...}块将在子build.gradle文件评估之前进行评估。因此,在评估subprojects {...}块时,该属性没有覆盖。

您可以在根项目中调用evaluationDependsOnChildren()来取消顺序,但我不建议这样做,因为它可能导致其他问题。

也许您可以使用闭包来延迟对属性的评估?

另一种选择是在根build.gradle中声明属性,而不是在子项目build.gradle中声明。

例如:

project(':xxx') {
   ext {
       diet4jActivationClass = 'xxx'
   }
}
project(':yyy') {
   ext {
       diet4jActivationClass = 'yyy'
   }
} 
subprojects {...}

或者另一种选择是使用afterEvaluate {...}闭包(我真的很讨厌这种方法,但是有时这是唯一的方法)

subprojects {
   afterEvaluate {...} 
}