渐变任务替换.java文件中的字符串



我想在编译代码之前替换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的增量构建功能来指定。

  1. 我绝对不会覆盖原始文件
  2. 我喜欢基于目录而不是基于文件名,所以如果是我,我会把Config.java放在它自己的文件夹中(例如src/replaceme/java
  3. 我会在$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)

最新更新