Gradle ProcessResources uptodatewhen

时间:2015-10-09 03:14:46

标签: java intellij-idea gradle

我有一个gradle任务,如下所示,在处理资源时替换令牌。

processResources {
filesMatching('**/application.yml') {
    filter org.apache.tools.ant.filters.ReplaceTokens, tokens: [
            rootDir: rootProject.rootDir.getAbsolutePath() ,
            commitId: rootProject.gitMetadata.commitId
    ]
}
}

我面临两个问题:

  1. 每当我修改application.yml文件时,我都被迫在启动服务器之前手动执行processResources任务(我使用IntelliJ Ultimate 14.1版本虽然我添加了在服务器部署之前的processResources任务,它没有帮助)。
  2. 虽然我有时会执行processResources,但输出文件没有正确处理(可能IntelliJ正在将文件复制到输出目录而不是gradle)并且gradle认为输出是最新的。
  3. 解决问题的最简单方法是添加以下语句

     outputs.upToDateWhen{false} 
    

    但是,我并不喜欢这个解决方案,因为它几乎违背了使用Gradle的目的(它就像一个干净的构建)。

    我想要做的是允许Gradle始终只处理/重新处理application.yml文件或将一个if cond放在uptoDate中以检查输出然后返回true或false。

    有办法吗?欢迎任何其他解决方案/更好的方法!

    谢谢!

    更新

    经过一些试验和错误后,以下解决方案可行。但是,我担心这是否会破坏可能有其他资源更新但未实际重新处理的情况..请告诉我这是否正确...

    processResources {
        //Re-Process the files only when the output application.yml file doesnt exist or if it contains the unresolved variables
        outputs.upToDateWhen {
            File configFileOutput = file("${sourceSets.main.output.resourcesDir}/config/application.yml")
            println configFileInput.absolutePath
            try {
                return !configFileOutput.text.contains('@')
            }
            catch (FileNotFoundException fe) {
                // This means that the file is not present and thus the task should Run
                return false;
            }
        }
        filesMatching('**/application.yml') {
            filter org.apache.tools.ant.filters.ReplaceTokens, tokens: [
                    rootDir: rootProject.rootDir.getAbsolutePath() ,
                    commitId: rootProject.gitMetadata.commitId
            ]
        }
    }
    

0 个答案:

没有答案