Gradle复制任务始终为UP-TO-DATE

3
我已经看到了很多次发布这个问题,但我还没有找到与我的具体用例匹配的答案。
我从一个包含环境属性的配置文件中迭代创建了一堆模板配置文件。
问题是,如果我在 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'
1个回答

3
您的复制任务的唯一输入是src/templates目录。除非src/templates的内容没有更改且复制的输出仍然存在,否则您的任务将被认为是"UP-TO-DATE"。
问题在于,您的复制任务实际上有第二个输入,Gradle不知道:您的config/regionConfig对象。
尝试使用inputs.propertyinputs.propertiesconfig对象(或对象值的哈希)添加到复制任务的输入中。

1
谢谢您解释得这么清楚。我会用解决方案更新我的原始帖子。 :-) - RCross

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接