我已多次发布此问题,但我还没有找到符合我特定用例的答案。
在迭代包含环境属性的配置文件后,我从模板创建了一堆配置文件。
问题是,如果我用一些新的值修改src / properties / ENV.gradle,当我调用任务时它会被忽略,因为它已经" UP-TO -date&#34 ;.我没有使用doFirst或doLast,这是发生这种情况的常见原因之一。
到目前为止我的解决方法是包含
outputs.upToDateWhen { false }
无论Gradle计算什么,都会强制每次重新创建配置文件,但这感觉就像一个糟糕的黑客。还有更好的方法吗?
以下是代码:
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)
第一个arg(引号)是此属性的名称,第二个是实际值。
现在,当我更改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'
答案 0 :(得分:2)
复制任务的唯一输入是src/templates
目录。除非src/templates
的内容没有更改,否则复制的输出仍然存在,您的任务将被视为 UP-TO-DATE 。
问题是您的复制任务实际上有第二个输入,Gradle不知道:您的config
/ regionConfig
对象。
尝试使用config
或inputs.property
将inputs.properties
对象(或对象值的哈希值)添加到复制任务的输入中。