我想在编译代码之前替换Config.java文件中的几行。我所能找到的就是在复制过程中通过过滤器解析文件。一旦我必须复制它,我就必须把它保存在某个地方——这就是为什么我选择了解决方案:在替换行的同时复制到临时位置>删除原始文件>将复制的文件复制回原始位置>删除临时文件。有更好的解决方案吗?
您可能应该尝试类似ant的replaceregexp:
task myCopy << {
ant.replaceregexp(match:'aaa', replace:'bbb', flags:'g', byline:true) {
fileset(dir: 'src/main/java/android/app/cfg', includes: 'TestingConfigCopy.java')
}
}
此任务将用bbb
替换所有出现的aaa
。无论如何,这只是一个例子,你可以根据自己的目的对其进行修改,也可以用ant尝试一些类似的解决方案。
为了补充lance-java
的答案,我发现如果只有一个值需要更改,这个习惯用法会更简单:
task generateSources(type: Copy) {
from 'src/replaceme/java'
into "$buildDir/generated-src"
filter { line -> line.replaceAll('xxx', 'aaa') }
}
注意:请记住,Copy
任务只有在源文件发生更改时才会运行。如果您希望替换基于其他条件,则需要使用Gradle的增量构建功能来指定。
- 我绝对不会覆盖原始文件
- 我喜欢基于目录而不是基于文件名,所以如果是我,我会把Config.java放在它自己的文件夹中(例如
src/replaceme/java
) - 我会在
$buildDir
下创建一个generated-src
目录,以便通过clean
任务删除它
您可以使用Copy任务和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
如果您确实希望使用临时文件策略覆盖原始文件,下面将创建筛选后的文件,将其复制到原始文件上,然后删除临时文件。
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)