Подтвердить что ты не робот

Как искать строку в файлах с помощью Ant (убедитесь, что определенная строка не найдена в исходных файлах)

Я бы хотел найти строку в моих исходных файлах с помощью Ant. (Я хочу, чтобы моя сборка завершилась неудачей, если в моих исходных файлах обнаружена определенная строка).

Итак, я должен иметь возможность рекурсивно искать определенную строку в наборе файлов.

Я уже нашел, что могу использовать задачу загрузки файла, чтобы проверить найден ли шаблон строки внутри одного файла. Но это кажется рабочим и разумным только с одним файлом.

С другой стороны, заменить задачу обеспечит рекурсивно поиск и замену. Думаю, я мог бы это сделать до сборки и замены моей строки чем-то, что сломало бы сборку, но мне интересно, есть ли какое-то более чистое решение?

br, Touko

4b9b3361

Ответ 1

Для этого вы можете использовать набор файлов selectors. Селекторы позволяют выбирать файлы на основе контента, размера, редактируемости и т.д. Вы можете комбинировать селекторов с включенными именами и исключать или использовать шаблоны.

Ниже приведен пример. Второй набор файлов получен из первого, с селектором, который просто совпадает с содержимым файла. Для более сложного соответствия существует селектор containsregexp. Результатом является набор файлов, содержащий только файлы, соответствующие строке. Затем сбойная задача с условием resourcecount используется для сбоя сборки, если только этот набор файлов не пуст.

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

(Старый ответ): Если настройка или повторное использование наборов файлов может быть проблематичной, вот иллюстрация относительно простой альтернативы.

Идея состоит в том, чтобы сделать копию файлов, затем замените строку, которую вы хотите найти с некоторым значением флага в скопированных файлах. Это обновит последнее измененное время на любом соответствующем файле. Задача uptodate может быть использована для поиска затронутых файлов. Наконец, если файлы не совпадают, вы можете fail построить.

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

Ответ 2

Это было очень полезно для начала, но у меня есть список строк, которые нужно проверить в наборе файлов.

Мой текущий код sofar:

<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}'"/>

Это хорошо работает, но как расширять его, поэтому ${search4} считывается из списка. Фактически список может быть прочитан из файла, содержащего каждый элемент поиска, на отдельной строке.

Ответ 3

Немного более краткий вариант в первой части ответа @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>