2010-11-29 10 views
12

Me gustaría buscar una cadena dentro de mis archivos fuente con Ant. (Me gustaría que fallara mi compilación en caso de que se encuentre cierta cadena dentro de mis archivos fuente).Cómo buscar una cadena en archivos con Ant (asegúrese de que no se encuentre cierta cadena en los archivos fuente)

Por lo tanto, debería ser capaz de buscar recursivamente una determinada cadena dentro de un conjunto de archivos.

Ya encontré que puedo usar loadfile task para verificar whether a string pattern is found within one file. Pero eso parece estar funcionando & sensible solo con un solo archivo.

Por otro lado, replace task proporcionaría búsqueda y reemplazo recursivo. Creo que podría hacer eso antes de construir y reemplazar mi cadena con algo que rompa la construcción, pero me pregunto si hay alguna solución más limpia.

ancho, Touko

Respuesta

16

Es posible considerar el uso conjunto de archivos selectors para hacer esto. Los selectores le permiten elegir archivos según el contenido, el tamaño, la capacidad de edición, etc. Puede combinar selectores con inclusiones y exclusiones basadas en nombres, o conjuntos de patrones.

A continuación se muestra un ejemplo. El segundo conjunto de archivos se deriva del primero, con un selector que simplemente coincide con el contenido del archivo. Para una coincidencia más sofisticada está el containsregexp selector. El resultado es un conjunto de archivos que contiene solo archivos que coinciden con la cadena. A continuación, se utiliza una tarea de falla con un resourcecount condition para fallar la compilación, a menos que ese conjunto de archivos esté vacío.

<property name="src.dir" value="src" /> 
<property name="search.string" value="BAD" /> 

<fileset id="existing" dir="${src.dir}"> 
    <patternset id="files"> 
     <!-- includes/excludes for your source here --> 
    </patternset> 
</fileset> 

<fileset id="matches" dir="${src.dir}"> 
    <patternset refid="files" /> 
    <contains text="${search.string}" /> 
</fileset> 

<fail message="Found '${search.string}' in one or more files in '${src.dir}'"> 
    <condition> 
     <resourcecount when="greater" count="0" refid="matches" /> 
    </condition> 
</fail> 

(respuesta Antiguo): Si el ajuste o la reutilización de los conjuntos de archivos podría ser problemático, aquí es una ilustración de una alternativa simple relativamente.

La idea es hacer una copia de los archivos, vuelva a colocar la cadena que desee buscar con algún valor del indicador en los archivos copiados. Esto actualizará la última hora de modificación en cualquier archivo coincidente. La tarea uptodate se puede usar para buscar archivos afectados. Finalmente, a menos que no coincidan los archivos, puede fail construir.

<property name="src.dir" value="src" /> 
<property name="work.dir" value="work" /> 
<property name="search.string" value="BAD" /> 

<delete dir="${work.dir}" /> 
<mkdir dir="${work.dir}" /> 
<fileset dir="${src.dir}" id="src.files"> 
    <include name="*.txt" /> 
</fileset> 
<copy todir="${work.dir}" preservelastmodified="true"> 
    <fileset refid="src.files" /> 
</copy> 
<fileset dir="${work.dir}" id="work.files"> 
    <include name="*.txt" /> 
</fileset> 
<replaceregexp match="${search.string}" 
       replace="FOUND_${search.string}"> 
    <fileset refid="work.files" /> 
</replaceregexp> 
<uptodate property="files.clean"> 
    <srcfiles refid="work.files" /> 
    <regexpmapper from="(.*)" to="${basedir}/${src.dir}/\1" /> 
</uptodate> 
<fail message="Found '${search.string}' in one or more files in dir '${src.dir}'" 
     unless="files.clean" /> 
+0

El primer ejemplo se puede hacer algo más concisa usando sólo el conjunto de archivos 'partidos' con un 'incluye' atributo, omitiendo el anidado . –

+1

@EdRandall puede publicar una respuesta con un ejemplo, por favor – Moudiz

1

Esto era muy útil como punto de partida, pero tengo una lista de cadenas que deben ser comprobadas en un conjunto de archivos.

Mi código actual sofar es decir:

<property name="search4" value="XYZ"/> 

<fileset id="existing" dir="../src"> 
    <patternset id="files"> 
    <include name="content/**/*.txt"/> 
    </patternset> 
</fileset> 

<resourcecount property="count"> 
    <fileset id="matches" dir="../src"> 
    <patternset refid="files" /> 
    <contains text="${search4}" /> 
    </fileset> 
</resourcecount> 
<echo message="Found '${search4}' in files : '${count}'"/> 

que funciona bien, pero la forma de expandir ese modo que el $ {} search4 se leen de una lista. En realidad, la lista se puede leer desde un archivo que contiene cada elemento de búsqueda en una línea separada.

0

variación ligeramente más concisa en la primera parte de la respuesta de @ martinclayton:

<property name="log.dir" value="logs" /> 
<property name="fail.string" value=" FAILED " /> 

<fileset id="build.failures" dir="${log.dir}" includes="*.log"> 
    <contains text="${fail.string}"/> 
</fileset> 
<fail status="1" message="One or more failures detected"> 
    <condition> 
     <resourcecount when="greater" count="0" refid="build.failures" /> 
    </condition> 
</fail> 
Cuestiones relacionadas