web-dev-qa-db-ja.com

Gradleタスクは.Javaファイルの文字列を置き換えます

コードがコンパイルされる前に、Config.Javaファイルの数行を置き換えたいのですが。私が見つけることができたすべてはそれをコピーしている間フィルターを通してファイルを解析することです。それをコピーする必要があるとすぐに、どこかに保存する必要がありました。そのため、解決策を探しました。一時的な場所にコピーして、行を置き換えます>元のファイルを削除>複製されたファイルを元の場所にコピー>一時ファイルを削除します。より良い解決策はありますか?

21
Srneczek

アリの replaceregexp のようなものを試すべきかもしれません:

task myCopy << {
    ant.replaceregexp(match:'aaa', replace:'bbb', flags:'g', byline:true) {
        fileset(dir: 'src/main/Java/Android/app/cfg', includes: 'TestingConfigCopy.Java')
    }
}

このタスクは、すべてのaaabbbに置き換えます。とにかく、それは単なる例であり、目的に応じて変更したり、antを使用して同様の解決策を試したりできます。

18
Stanislav

lance-Javaの答えを補足するために、変更しようとしている値が1つしかない場合は、このイディオムの方が簡単であることがわかりました。

task generateSources(type: Copy) {
    from 'src/replaceme/Java'
    into "$buildDir/generated-src"
    filter { line -> line.replaceAll('xxx', 'aaa') }
}
16
  1. 私は間違いなく元のファイルを上書きしません
  2. ファイル名ではなくディレクトリベースにしたいので、私ならConfig.Javaを独自のフォルダに入れます(例:src/replaceme/Java
  3. generated-srcの下に$buildDirディレクトリを作成して、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
12
lance-java