Gradle 复制任务总是最新的

Gradle Copy task always UP-TO-DATE

我已经多次看到这个问题,但我还没有找到符合我的具体用例的答案。

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

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

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

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

尝试使用 inputs.propertyinputs.properties.

config 对象(或对象值的散列)添加到复制任务的输入