муравьиная фильтрация - не работает, если свойство не установлено - PullRequest
30 голосов
/ 22 октября 2008

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

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

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

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

Спасибо

Ответы [ 5 ]

98 голосов
/ 17 марта 2009

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

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

Более подробную информацию см. В документации по задаче Ant Ant .

19 голосов
/ 15 ноября 2008

Вы можете сделать это в муравье 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"/>
4 голосов
/ 22 октября 2008

Я собирался предложить вам использовать <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"/>
0 голосов
/ 23 октября 2013

Поскольку 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>
0 голосов
/ 14 ноября 2008

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

для обычных

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...