2015-11-01 5 views
6

Desidero sostituire alcune righe nel mio file Config.java prima che il codice venga compilato. Tutto quello che sono riuscito a trovare è analizzare il file attraverso il filtro durante la copia. Non appena devo copiarlo ho dovuto salvarlo da qualche parte - ecco perché sono andato per la soluzione: copiare in posizione temp sostituendo le righe> cancella il file originale> copia il file duplicato nella posizione originale> cancella il file temporaneo. C'è una soluzione migliore?L'operazione gradle sostituisce la stringa nel file .java

risposta

8

può essere che si dovrebbe provare qualcosa di simile formica di replaceregexp:

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

Questo compito sarà sostituire tutte le occorrenze di aaa con bbb. Ad ogni modo, è solo un esempio, puoi modificarlo sotto i tuoi scopi o provare qualche soluzione simile con la formica.

+0

vedere un altro aproach a: [http: // stackoverflow.com/a/17572644/890357](http://stackoverflow.com/a/17572644/890357) – marciowb

3
  1. Certamente non sovrascrivere il file originale
  2. mi piace mantenere le cose directory base piuttosto che il nome del file in base, quindi se si trattasse di me, avevo messo Config.java nella cartella di essa la propria (ad esempio src/replaceme/java)
  3. Vorrei creare una directory generated-src sotto $buildDir in modo che venga eliminata tramite l'attività clean.

È possibile utilizzare il filtro Copia e Sostituisci filtri. Ad esempio:

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 
+0

Ho già utilizzato il metodo di sostituzione e il suo funzionamento in modo impeccabile ma una volta modificato manualmente il file Config.java, potrei raggiungere alcuni indesiderati afferma, quindi la tua soluzione sembra molto meglio. Cosa fa esattamente compileJava.source = [files]? Come fa a sapere se voglio sostituire Config.java nel pacchetto di parole 'com.example.cfg' e non nel file con lo stesso nome nel pacchetto 'com.example.remote.cfg'? – Srneczek

+0

Come ho detto, preferisco usare le directory piuttosto che i pattern specifici dei nomi dei file. Quindi nel mio esempio tutto in 'src/replaceme/java' sarà sostituito indipendentemente dal pacchetto. 'compileJava.source generateSources.outputs.files' richiama [JavaCompile.source (...)] (https://docs.gradle.org/current/javadoc/org/gradle/api/tasks/compile/JavaCompile.html) che alla fine aggiunge le sorgenti generate in modo che vengano compilate insieme ai normali file sorgente (in 'src/main/java'). Non c'è nessun segno "=" nel mio suggerimento –

1

Per completare lance-java 's risposta, ho trovato questo idioma più semplice se c'è solo un valore che si sta cercando di cambiare:

task generateSources(type: Copy) { 
    from 'src/replaceme/java' 
    into "$buildDir/generated-src" 
    filter { line -> line.replaceAll('xxx', 'aaa') } 
}