Как искать строку в файлах с Ant (убедитесь, что определенная строка не найдена в исходных файлах) - PullRequest
12 голосов
/ 29 ноября 2010

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

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

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

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

br, Touko

Ответы [ 3 ]

16 голосов
/ 29 ноября 2010

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

Ниже приведен пример.Второй набор файлов является производным от первого, с селектором, который просто совпадает с содержимым файла.Для более сложного соответствия есть селектор 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" />
1 голос
/ 22 октября 2013

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

Мой текущий программный код:

<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} читался из списка.На самом деле список можно прочитать из файла, содержащего каждый элемент поиска, в отдельной строке.

0 голосов
/ 23 июня 2017

Чуть более краткий вариант первой части ответа @ 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...