2011-12-19 16 views
14

Estoy tratando de reemplazar el hecho de una cadena en un archivo wxs usando Nant.¿Cómo reemplazar la cadena en un archivo usando NANT?

Solo he encontrado el siguiente ejemplo, que usa <replaceString>, pero parece que solo se puede usar dentro de los archivos copiados. ¿Hay alguna otra forma de reemplazar una cadena, sin copiar los archivos?

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

Respuesta

2

he encontrado una solución para usted aquí: 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> 

Usted puede envolver esto en un elemento <foreach />.

+1

FWI, el enlace ha cambiado a http://frank.overseakids.com/?p=182 – thomasb

+0

Gracias @ thomasbtv, acabo de actualizarlo. :) –

8

Aquí está el código:

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

La documentación oficial NAnt para <loadfile> elemento contienen the exact sample you need. Vea el final de la página.

+5

esto casi funcionó para mí, lo que faltaba era echo'ing el archivo de nuevo a sustituir a la antigua - http://stackoverflow.com/questions/487451/how-to-modify-source-with-nant – shanabus

3

¿Está intentando modificar un archivo .wxs que es XML, correcto?

En este caso particular, puede usar <xmlpoke> si puede determinar la posición de las cadenas para reemplazar mediante XPath.

1

Nunca logré obtener la cadena de filtro y reemplazar las señales para que funcionen correctamente. Terminé usando esto y funciona muy bien.

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

Así es como lo hice.

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

más simple y más completo, gracias –

1

Todas estas respuestas no funcionaron para mí, tal vez porque necesitaba reemplazar una cadena con espacios en ella. Cargar un contenido de archivo con filterchain/replacetokens no hizo nada con el contenido de la propiedad asociada. Tal vez lo estoy usando mal.
Las tareas "replacestring" y "replacetext" sugeridas por @Ally y @John Sterne no existen.

Se incluye en un proceso de compilación de Jenkins, por lo que la variable ENTORNO se debe establecer en el directorio de trabajo.

<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

Tuve ese problema hoy. Para resolverlo utilicé el comando mover en lugar de cargar archivo o copiar. Esto funcionó para mí porque mi archivo era bastante pequeño. La otra advertencia sobre esto es que replacetokens necesita un identificador de inicio y un identificador final del token; begintoken y endtoke respectivamente. Si no están configurados, los valores predeterminados son el símbolo @. Por lo tanto, si desea reemplazar un valor como MY_SERVER_PLACE_HOLDER, significa que el valor en su archivo debe ser @ MY_SERVER_PLACE_HOLDER @. Si desea que su token comience con algo diferente de lo que debe especificar los valores begintoken y endtoken. Eso debería darte una idea de los problemas que token y endtoken te traerán.

Así que aquí es lo que hice en pocas palabras

  1. movido el archivo en una ubicación temporal. En ese movimiento usé filterchain con removetokens para cambiar los valores en el archivo.
  2. En el paso 2, moví el archivo a su ubicación original.
  3. Luego utiliza el comando de borrado para borrar la carpeta temporal que creé.

Aquí está una lo que hice. (Puede que no sea sintácticamente correcta ya que no estoy delante del código en el 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" /> 
Cuestiones relacionadas