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

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

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

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

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

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

Спасибо

4b9b3361

Ответ 1

Вы можете сделать это в ant 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"/>

Ответ 2

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

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

Ответ 3

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

Я думаю, что лучше всего использовать <exec> to (в зависимости от вашей платформы dev) сделать 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"/>

Ответ 4

Если команда 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"/>

для conditonal

Ответ 5

Так как 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>