2014-06-15 4 views
6

Ho un semplice script di build Gradle per compilare e impacchettare (simile al plug-in dell'applicazione) la mia applicazione Java. L'unica cosa che non riesco a fare è sostituire il numero di versione corrente in un semplice file .properties.Il progetto java gradle sostituisce una riga singola nel file durante la creazione

Ho creato un file 'src/main/resources/app-info.properties' con una singola riga 'application.version = @ version @'. No Voglio sostituire questa stringa di versione ogni volta che il file viene copiato nella cartella di build (pensa che questo accada durante l'attività di compilazione).

Ho già provato una soluzione semplice con le formiche ReplaceTokens. Questo ha sostituito la versione, ma ha anche rotto i miei file .png nelle risorse ..

Quindi c'è una soluzione semplice per sostituire semplicemente i token in un singolo file durante l'attività di compilazione (o qualsiasi altra attività gestisca la copia nella cartella di build)?

Grazie per qualsiasi aiuto! Ben

====== Modifica sulla base del commento da Opal =====

Sulla base del suggerimento ho aggiunto il seguente:

import org.apache.tools.ant.filters.ReplaceTokens 
// ... 
build { 
    from('src/main/resources') { 
     include '*.properties' 
     filter(ReplaceTokens, tokens: [version : project.version]) 
    } 
} 

che getta questo errore:

Could not find method from() for arguments [src/main/resources, [email protected]] on root project

Sembra che io abbia un compito sbagliato?

Modifica ====== per completezza l'aggiunta della soluzione basata su opali suggeriscono =====

Grazie uomo, il seguente è la soluzione di lavoro!

processResources { 
    from('src/main/resources') { 
     include '*.properties' 
     filter(ReplaceTokens, tokens: [version : project.version]) 
    } 
} 

risposta

7

Anche libri e blog, compresa la risposta di Opal, raccomandano l'utilizzo di una miscela vivida di exclude/include, from() e filter(). E, naturalmente, anche al primo tentativo di sostituire il testo {{app javascript library}} in un file index.html nel percorso di una libreria JavaScript che dipendeva da una semplice impostazione di proprietà del progetto.

Il problema che mi colpiva era che il mio compito di "guerra" produceva file index.html duplicati nell'archivio di guerra e liberarsi del problema, usando lo schema descritto in precedenza, ha portato a un enorme hack illeggibile.

Poi ho trovato una soluzione davvero semplice.Il seguente esempio è tratto dal mio script di compilazione e devi personalizzarlo un po 'per soddisfare le tue esigenze:

war { 
    eachFile { copyDetails -> 
     if (copyDetails.path == 'index.html') { 
      filter { line -> 
       line.replace('{{app javascript library}}', "lib/someLib.js") 
      } 
     } 
    } 
} 
3

Incolla codice di esempio. Quello che devi fare è includere il file per la sostituzione e escludere altri file dalla sostituzione. Here è l'utilizzo di esempio. Cerca ReplaceTokens e vedrai di cosa sto parlando.

È necessario aggiungere il filtro all'attività processResources. Esempio di codice:

processResources { 

    def profile = project.properties['profile'] 

    def replace_tokens = profile ? filter_tokens[profile] : filter_tokens['default'] 

    exclude '**/log4j-test.xml' 

    from('src/main/resources') { 
     exclude '**/*.ttf' 
     filter(ReplaceTokens, tokens: replace_tokens) 
    } 

    from('src/main/resources') { 
     include '**/*.ttf' 
    } 
} 

Sopra ttf file (binari) sono esclusi dal filtraggio ma copiato. replace_tokens è un filtro prelevato dalla mappa definita in un'altra parte dello script.

+0

Siamo spiacenti, attualmente non c'è codice di esempio in quanto non ho una soluzione per sostituire la linea. Come descritto, voglio solo sostituire alcuni token in un file di risorse che è ** già ** copiato dal plugin Java (si pensi all'attività di compilazione). Quindi pensi che il metodo di copia ti aiuti qui? – Ben