【发布时间】:2015-11-01 16:46:15
【问题描述】:
我想在编译代码之前替换我的 Config.java 文件中的几行。我所能找到的只是在复制文件时通过过滤器解析文件。一旦我必须复制它,我就必须将它保存在某个地方 - 这就是我寻求解决方案的原因:在替换行时复制到临时位置 > 删除原始文件 > 将重复的文件复制回原始位置 > 删除临时文件。有没有更好的解决方案?
【问题讨论】:
我想在编译代码之前替换我的 Config.java 文件中的几行。我所能找到的只是在复制文件时通过过滤器解析文件。一旦我必须复制它,我就必须将它保存在某个地方 - 这就是我寻求解决方案的原因:在替换行时复制到临时位置 > 删除原始文件 > 将重复的文件复制回原始位置 > 删除临时文件。有没有更好的解决方案?
【问题讨论】:
也许你应该试试像蚂蚁的replaceregexp:
task myCopy << {
ant.replaceregexp(match:'aaa', replace:'bbb', flags:'g', byline:true) {
fileset(dir: 'src/main/java/android/app/cfg', includes: 'TestingConfigCopy.java')
}
}
此任务会将所有出现的aaa 替换为bbb。无论如何,这只是一个示例,您可以根据自己的目的对其进行修改或尝试与ant类似的解决方案。
【讨论】:
为了补充lance-java 的回答,如果您只想更改一个值,我发现这个成语更简单:
task generateSources(type: Copy) {
from 'src/replaceme/java'
into "$buildDir/generated-src"
filter { line -> line.replaceAll('xxx', 'aaa') }
}
警告:请记住,Copy 任务仅在源文件更改时才会运行。如果您希望根据其他条件进行替换,则需要使用 Gradle 的增量构建功能来指定。
【讨论】:
src/replaceme/java)$buildDir 下创建一个generated-src 目录,以便通过clean 任务将其删除。您可以使用复制任务和 ReplaceTokens 过滤器。例如:
apply plugin: 'java'
task generateSources(type: Copy) {
from 'src/replaceme/java'
into "$buildDir/generated-src"
filter(ReplaceTokens, tokens: [
'xxx': 'aaa',
'yyy': 'bbb'
])
}
// the following lines are important to wire the task in with the compileJava task
compileJava.source "$buildDir/generated-src"
compileJava.dependsOn generateSources
【讨论】:
src/replaceme/java 中的所有内容都将被替换,而不管包如何。 compileJava.source generateSources.outputs.files 调用 JavaCompile.source(...) 最终添加生成的源文件,以便它们与普通源文件一起编译(在 src/main/java 中)。我的建议中没有“=”符号
如果您确实希望使用临时文件策略覆盖原始文件,以下将创建过滤后的文件,将它们复制到原始文件上,然后删除临时文件。
task copyAtoB(dependsOn: [existingTask]) {
doLast {
copy {
from("folder/a") {
include "*.java"
}
// Have to use a new path for modified files
into("folder/b")
filter {
String line ->
line.replaceAll("changeme", "to this")
}
}
}
}
task overwriteFilesInAfromB(dependsOn: [copyAtoB]) {
doLast {
copy {
from("folder/b") {
include "*.java"
}
into("folder/a")
}
}
}
// Finally, delete the files in folder B
task deleteB(type: Delete, dependsOn: overwriteFilesInAfromB) {
delete("folder/b")
}
nextTask.dependsOn(deleteB)
【讨论】: