Gradle Copy任务始终是UP-TO-DATE

时间:2018-04-03 14:53:09

标签: gradle gradle-task

我已多次发布此问题,但我还没有找到符合我特定用例的答案。

在迭代包含环境属性的配置文件后,我从模板创建了一堆配置文件。

问题是,如果我用一些新的值修改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'

1 个答案:

答案 0 :(得分:2)

复制任务的唯一输入src/templates目录。除非src/templates的内容没有更改,否则复制的输出仍然存在,您的任务将被视为 UP-TO-DATE

问题是您的复制任务实际上有第二个输入,Gradle不知道:您的config / regionConfig对象。

尝试使用configinputs.propertyinputs.properties对象(或对象值的哈希值)添加到复制任务的输入中。