我已经看到了很多次发布这个问题,但我还没有找到与我的具体用例匹配的答案。
我从一个包含环境属性的配置文件中迭代创建了一堆模板配置文件。
问题是,如果我在 src/properties/ENV.gradle 中修改一些新值,则在调用任务时它会被忽略,因为它已经是“UP-TO-DATE”状态。 我没有使用 doFirst 或 doLast,这是发生这种情况的常见原因之一。
到目前为止,我的解决方法是包括:
我从一个包含环境属性的配置文件中迭代创建了一堆模板配置文件。
问题是,如果我在 src/properties/ENV.gradle 中修改一些新值,则在调用任务时它会被忽略,因为它已经是“UP-TO-DATE”状态。 我没有使用 doFirst 或 doLast,这是发生这种情况的常见原因之一。
到目前为止,我的解决方法是包括:
outputs.upToDateWhen { false }
这段代码会强制重新创建配置文件,无论Gradle计算出什么结果,但这感觉像是一种可怕的hack。有没有更好的方法?
以下是代码:
task createConfigs
def addTemplateTasks(aProject, env, config) {
aProject.with {
task "templateCopy_${env}"(type: Copy) {
from "src/templates"
include "server.config.template"
into "${buildDir}"
rename { file -> "server.config.${env}" }
expand(regionConfig)
}
createConfigs.dependsOn "templateCopy_${env}"
}
}
def envFile = new File("${project.projectDir}/src/properties/ENV.gradle")
def envConfig = new ConfigSlurper().parse(envFile.text)
envConfig.each { env, config ->
addTemplateTasks(project, env, config)
}
解决方案:
我的情况有点特殊,我希望复制任务能自动察觉到“config”文件的更改,而不需要明确告诉它要注意它(请参见下面的已接受答案)。以下是修复问题的更改:def addTemplateTasks(aProject, env, config) {
aProject.with {
task "templateCopy_${env}"(type: Copy) {
inputs.property("environmentConfig", config)
第一个参数(用引号括起来)是此属性的名称,第二个参数是实际值。
现在,当我更改 ENV.gradle 文件中的属性并运行“gradle -i”时,会看到以下内容:
Task ':component-foo:templateCopy_DEV' is not up-to-date because:
Value of input property 'environmentConfig' has changed for task ':component-foo:templateCopy_DEV'