2010-12-22 6 views
13

Estoy bastante seguro de que esta es una pregunta simple de responder y he visto que preguntaba antes simplemente no hay respuestas sólidas.Reemplazo de todos los tokens basado en el archivo de propiedades con ANT

Tengo varios archivos de propiedades que se utilizan para diferentes entornos, es decir xxxx-dev, xxxx-test,

Los archivos de propiedades xxxx-vivo contener algo como:

server.name=dummy_server_name 
server.ip=127.0.0.1 

Los archivos de plantilla im usando algo como:

<...> 
    <server name="@[email protected]" ip="@[email protected]"/> 
</...> 

Lo anterior es un ejemplo muy primitivo, pero estoy preguntando si hay una manera de decirle simplemente ANT para reemplazar todas las fichas basadas en el archivo de propiedades, en lugar de tener que codificar una línea token para cada uno ... es decir

<replacetokens> 
    <token key="server.name" value="${server.name}"/> 
    <token key="server.ip" value="${server.ip}"/> 
</replacetokens> 

Cualquier ayuda sería grande!

Respuesta

15

Puede especificar el archivo de propiedades de las que al leer la lista de fichas para el 'replace' task usando replacefilterfile:

<replace file="input.txt" replacefilterfile="properties.txt"/> 

Del mismo modo, en una cadena de filtros, puede utilizar 'replacetokens' propertyfile:

Este tratará cada entrada del archivo de propiedades en sample.properties como un par de token/clave :

<loadfile srcfile="${src.file}" property="${src.file.replaced}"> 
    <filterchain> 
    <filterreader classname="org.apache.tools.ant.filters.ReplaceTokens"> 
     <param type="propertiesfile" value="sample.properties"/> 
    </filterreader> 
    </filterchain> 
</loadfile> 
+0

leyenda, gracias por la ayuda! – Grofit

+0

¿Hay alguna manera de hacer esto si necesita propiedades que procedan de> 1 archivo de propiedad diferente? La única forma que conozco es crear un nuevo archivo que concatena el archivo, ¿conoces una forma mejor? –

+1

@MarkRhodes - Perdón por la demora ... No puedo pensar en nada que no sea equivalente a concatenar. Sin embargo, debería ser lo suficientemente simple para hacer eso. Replacetokens no admite un archivo establecido para los reemplazos. –

1

Con la tarea de reemplazo por sí misma omití los @ delimitadores alrededor de tokens, así que se me ocurrió la siguiente solución. Se puede utilizar cualquier propiedad de hormigas en la plantilla del archivo

<project name="replace" default="replace"> 

<property file="build.properties" /> 
<target name="replace"> 

    <!-- create temp file with properties --> 
    <tempfile property="temp.replace" suffix=".properties"/> 
    <echoproperties destfile="${temp.replace}" /> 
    <!-- replace name=value with @[email protected]=value --> 
    <replaceregexp file="${temp.replace}" match="([^=]*)=" replace="@\[email protected]=" byline="true" /> 

    <!-- copy template and replace properties --> 
    <copy file="template.txt" tofile="replaced.txt" /> 
    <replace file="replaced.txt" replacefilterfile="${temp.replace}" /> 

</target> 

con una plantilla

ANT home @[email protected] 
ANT version @[email protected] 
server name @[email protected] ip @[email protected] 

esto se traduce en

ANT home /usr/share/ant 
ANT version 1.7 
server name dummy_server_name ip 127.0.0.1 
Cuestiones relacionadas