我有一个gradle任务,如下所示,在处理资源时替换令牌。
processResources {
filesMatching('**/application.yml') {
filter org.apache.tools.ant.filters.ReplaceTokens, tokens: [
rootDir: rootProject.rootDir.getAbsolutePath() ,
commitId: rootProject.gitMetadata.commitId
]
}
}
我面临两个问题:
解决问题的最简单方法是添加以下语句
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
]
}
}