Фильтрация муравьев - не работает, если свойство не установлено

У меня есть муравей build.xml который использует <copy> Задача для копирования различных файлов XML. Он использует фильтрацию для объединения свойств из build.properties файл. Каждая среда (dev, stage, prod) имеет разные build.properties который хранит конфигурацию для этой среды.

Иногда мы добавляем новые свойства в Spring XML или другие файлы конфигурации, которые требуют обновления build.properties файл.

Я хочу, чтобы муравей быстро потерпел неудачу, если отсутствуют свойства build.properties, То есть если есть сырье @...@ токены превращают его в сгенерированные файлы, я хочу, чтобы сборка умерла, чтобы пользователь знал, что ему нужно добавить одно или несколько свойств в свои локальные build.properties.

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

Спасибо

5 ответов

Решение

Вы можете сделать это в муравье 1.7, используя комбинацию LoadFile задача и match состояние.

<loadfile property="all-build-properties" srcFile="build.properties"/>
<condition property="missing-properties">
    <matches pattern="@[^@]*@" string="${all-build-properties}"/>
</condition>
<fail message="Some properties not set!" if="missing-properties"/>

Если вы ищете конкретное свойство, вы можете просто использовать задачу с ошибкой с атрибутом ЖК, например:

<fail unless="my.property">Computer says no. You forgot to set 'my.property'!</fail>

Обратитесь к документации по задаче Ant для более подробной информации.

Я собирался предложить вам попробовать использовать <property file="${filter.file}" prefix="filter"> на самом деле загрузить свойства в Ant, а затем fail если какой-либо из них не установлен, но я думаю, что я неправильно истолковал вашу проблему (что вы хотели потерпеть неудачу, если указанное свойство не было установлено в файле свойств).

Я думаю, что ваш лучший выбор может быть использовать <exec> чтобы (в зависимости от вашей платформы разработки) выполнить grep для символа "@", а затем установить для свойства число найденных случаев. Не уверен в точном синтаксисе, но...

<exec command="grep \"@\" ${build.dir} | wc -l" outputproperty="token.count"/>
<condition property="token.found">
    <not>
        <equals arg1="${token.count}" arg2="0"/>
    </not>
</condition>
<fail if="token.found" message="Found token @ in files"/>

Начиная с Ant 1.6.2 condition также может быть вложен внутрь fail,

Следующий макрос упрощает условную проверку нескольких свойств.

<macrodef name="required-property">
    <attribute name="name"/>
    <attribute name="prop" default="@{name}"/>
    <attribute name="if" default="___"/>
    <attribute name="unless" default="___"/>
    <sequential>
        <fail message="You must set property '@{name}'">
            <condition>
                <and>
                    <not><isset property="@{prop}"/></not>
                    <or>
                        <equals arg1="@{if}" arg2="___"/>
                        <isset property="@{if}"/>
                    </or>
                    <or>
                        <equals arg1="@{unless}" arg2="___"/>
                        <not><isset property="@{unless}"/></not>
                    </or>
                </and>
            </condition>
        </fail>
    </sequential>
</macrodef>

<target name="required-property.test">
    <property name="prop" value=""/>
    <property name="cond" value="set"/>
    <required-property name="prop"/>
    <required-property name="prop" if="cond"/>
    <required-property name="prop" unless="cond"/>
    <required-property name="prop" if="cond2"/>
    <required-property name="prop" unless="cond2"/>
    <required-property name="prop" if="cond" unless="cond"/>
    <required-property name="prop" if="cond" unless="cond2"/>
    <required-property name="prop" if="cond2" unless="cond"/>
    <required-property name="prop" if="cond2" unless="cond2"/>
    <required-property name="prop2" unless="cond"/>
    <required-property name="prop2" if="cond2"/>
    <required-property name="prop2" if="cond2" unless="cond"/>
    <required-property name="prop2" if="cond" unless="cond"/>
    <required-property name="prop2" if="cond2" unless="cond2"/>
    <required-property name="success"/>
</target>

Если команда exec устарела в вашей версии ant, вы можете использовать редиректоры, например:

<exec executable="grep">
  <arg line="@ ${build.dir}"/>
  <redirector outputproperty="grep.out"/>
</exec>
<exec executable="wc" inputstring="${grep.out}">
  <arg line="-l"/>
  <redirector outputproperty="token.found"/>
</exec>

создать свойство token.found

<condition property="token.found">
    <not>
        <equals arg1="${token.count}" arg2="0"/>
    </not>
</condition>
<fail if="token.found" message="Found token @ in files"/>

для состояния

Другие вопросы по тегам