2011-12-19 9 views
14

Sto cercando di sostituire l'occorrenza di una stringa in un file wxs utilizzando Nant.Come sostituire la stringa in un file usando NANT?

Ho trovato solo il seguente esempio, che utilizza <replaceString>, ma sembra che possa essere utilizzato solo all'interno dei file copiati. C'è un altro modo di sostituire una stringa, senza effettivamente copiare i file?

<property name="NOW" value="${datetime::now()}" /> 
<copy todir="out"> 
    <fileset basedir="in"> 
     <include name="**/*" /> 
    </fileset> 
    <filterchain> 
     <replacetokens> 
      <token key="NOW" value="${TODAY}" /> 
     </replacetokens> 
     <tabstospaces /> 
    </filterchain> 
</copy> 

risposta

2

ho trovato una soluzione per voi qui: http://frank.overseakids.com/?p=182

<loadfile file=”${dir.template}\template.db_name.sql” property=”restore.db.sql.db_name”> 
<filterchain> 
<replacetokens> 
<!– this looks for tokens like @[email protected] in the file being loaded and replaces them–> 
<token key=”restore.db.prefix” value=”${restore.db.prefix}” /> 
<token key=”backup.file.path” value=”${backup.file.path}” /> 
</replacetokens> 
</filterchain> 
</loadfile> 
<property name=”current.db” value=”db_name” /> 
<property name=”current.log” value=”${dir.log}\${restore.db.logfile.prefix}_db_name.log” /> 
<property name=”current.file” value=”${dir.template}\restore.db_name.tmp.sql” /> 
<delete if=”${file::exists(current.file)}” file=”${current.file}” /> 
<echo file=”${current.file}”>${restore.db.sql.db_name}</echo> 

Puoi avvolgere questo in un elemento <foreach />.

+1

FWI, il collegamento è cambiato http://frank.overseakids.com/?p=182 – thomasb

+0

Grazie @ thomasbtv, l'ho appena aggiornato. :) –

8

Ecco il codice:

<loadfile file="token.txt" property="token-file"> 
    <filterchain> 
     <replacetokens> 
      <token key="NOW" value="${datetime::now()}" /> 
     </replacetokens> 
    </filterchain> 
</loadfile> 

La documentazione ufficiale NAnt per <loadfile> elemento contengono the exact sample you need. Vedi la parte inferiore della pagina.

+5

questo ha funzionato quasi per me, mancava il ritorno del file per sostituire quello vecchio - http://stackoverflow.com/questions/487451/how-to-modify-source-with-nant – shanabus

3

Quindi stai provando a modificare un file .wxs che è XML, giusto?

In questo caso particolare è possibile utilizzare <xmlpoke> se è possibile determinare la posizione delle stringhe da sostituire tramite XPath.

1

Non sono mai riuscito a far funzionare correttamente la filterchain e il replacetokens. Ho finito per usare questo e funziona benissimo.

<replacetext filename="${filename}" src="stringToBeReplaced" replacement="replacementString" /> 
6

Ecco come l'ho fatto.

<loadfile file="${file}" property="file.content"> 
    <filterchain> 
     <replacestring from="StringToMatch" to="StringToReplace" ignorecase="true" /> 
    </filterchain> 
</loadfile> 
<echo file="${file}">${file.content}</echo> 
+0

più semplice e completo, grazie –

1

Tutte queste risposte non hanno funzionato per me, forse perché avevo bisogno di sostituire una stringa con spazi al suo interno. Caricamento di un contenuto di file con filterchain/replacetokens non ha fatto nulla per il contenuto della proprietà associata. Forse lo sto usando male.
Le attività "replacestring" e "replacetext" suggerite da @ Ally e @John Sterne non esistono.

È incluso in un processo di generazione Jenkins, pertanto la variabile AMBIENTE deve essere impostata sulla directory di lavoro.

<loadfile file="./my/batch.bat" property="file.content" /> 
    <property name="file.content" 
       value="${string::replace(file.content, 'D:\path to\the working\space', environment::get-variable('WORKSPACE'))}" /> 
    <property name="file.content" 
       value="${string::replace(file.content, 'Cd C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin', 'CD /D C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin')}" /> 
    <echo file="./my/batch.bat">${file.content}</echo> 
1

Ho avuto quel problema oggi. Per risolverlo ho usato il comando move invece di loadfile o copy. Questo ha funzionato per me perché il mio file era piuttosto piccolo. L'altra precauzione su questo è che replacetokens ha bisogno di un identificatore di inizio e di un identificatore finale del token; begintoken e endtoke rispettivamente. Se questi non sono impostati, i valori predefiniti sono il simbolo @. Pertanto, se desideri sostituire un valore come MY_SERVER_PLACE_HOLDER, significa che il valore nel file deve essere @ MY_SERVER_PLACE_HOLDER @. Se vuoi che il tuo token inizi con qualcosa di diverso da quello che devi specificare i valori begintoken e endtoken. Questo dovrebbe darti un'idea dei problemi che il token iniziale e l'endtoken ti porteranno.

ecco quello che ho fatto in poche parole

  1. spostato il file in una posizione temporanea. In quella mossa ho usato la filterchain con i remoti per cambiare i valori nel file.
  2. Nel passaggio 2, ho spostato il file nella posizione originale.
  3. Ho quindi utilizzato il comando delete per eliminare la cartella temporanea che ho creato.

Ecco cosa ho fatto. (Potrebbe non essere sintatticamente corretta in quanto non sono in davanti al codice al momento)

<move todir="temp"> 
     <fileset basedir="in"> 
     <include name="myfile.dat" /> 
     </fileset> 
     <filterchain> 
      <replacetokens> 
      <token key="MY_SERVER_PLACE_HOLDER" value="http://www.someserver.com" /> 
      </replacetokens> 
      <tabstospaces /> 
     </filterchain> 
    </move> 
    <move todir="in"> 
     <fileset basedir="temp"> 
      <include name="myfile.dat" /> 
     </fileset> 
    </move> 
    <delete dir="temp" /> 
Problemi correlati