我希望在代码编译之前替换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')
}
}
这个任务将会把所有的 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
中)旁边进行编译。在我的建议中没有 "=" 符号。 - lance-javatask 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)