Условное свойство в файле свойств Ant

Можно ли условно установить значение свойства в файлах свойств Ant (в отличие от build.xml)? Например, если установлено свойство apache.root - my_property будет ${apache.root}/myapp, /var/www/myapp иначе. Если нет, какова будет обычная практика - многоразовые файлы build.xml?

Ответ 1

Используйте задачу condition:

<project name="demo" default="run">

    <condition property="my_property" value="${apache.root}/myapp" else="/var/www/myapp">
        <isset property="apache.root"/>
    </condition>

    <target name="run">
        <echo message="my_property=${my_property}"/>
    </target>

</project>

Ответ 2

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

    <echo>Building ${ant.project.name} on OS: ${os.name}-${os.arch}</echo>
<property file="build-${os.name}.properties" />

это будет включать файл с именем "build-Windows 7.properties" или "build -Linux.properties" в зависимости от того, где выполняется сборка. Разумеется, директива property выглядит в текущем каталоге, а также в домашнем каталоге. Таким образом, файл свойств может быть частью источника сборки или в домашнем каталоге учетной записи сборки.

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

Ответ 3

Одним из простейших форм условия вы можете использовать:

<exec executable="hostname" outputproperty="hostname"/>
<condition property="python" value="/usr/bin/python3.4">
  <equals arg1="${hostname}"    arg2="host0"/>
</condition>
<property name="python" value="/usr/bin/python"/>

для размещения, например, другого пути установки python. Здесь путь установки по умолчанию -/usr/bin/python, за исключением host0, где он/usr/bin/python3.4

Ответ 4

ОП запрашивал файл свойств, а не в файле сборки ant. К сожалению, условные выражения не могут быть выполнены из файла свойств. Что вы можете сделать, так это отдельные файлы свойств для каждого набора зависимых свойств. Например:

build.xml

<condition property="app.name" value="appA">
    <equals arg1="${appName}" arg2="A" />
</condition>
<condition property="app.name" value="appB">
    <equals arg1="${appName}" arg2="B" />
</condition>
<property file="${app.name}.properties" />
<!-- since properties are immutable, set your defaults here -->
<property name="apache.root" value="/var" />
<property file="restOfProps.properties" />

appA.properties

apache.root=/appA

restOfProps.properties

my_property=${apache.root}/myapp