Аргумент не нулевой - PullRequest
       2

Аргумент не нулевой

1 голос
/ 15 июня 2011

Я пытаюсь проверить, установлен аргумент сценария сборки муравья или нет. Я пробовал много способов сделать это, но безуспешно. Я определяю аргумент с помощью -Dmaindir="../propertyfolderpath".

Вот пример кода, который я пробовал;

<ac:if>
    <equals arg1="@{maindir}" arg2="" />
    <ac:then>
        <echo message="maindir argument is empty. Current properties will be used." />
        <property file="build.properties" />
    </ac:then>
    <ac:else>
        <echo message="maindir = ${maindir}" />
        <ac:if>
            <ac:available file="${maindir}/build.properties" type="file" />
            <ac:then>
                <property file="${maindir}/build.properties" />
            </ac:then>
            <ac:else>
                <fail message="${maindir} is not a valid path." />
            </ac:else>
        </ac:if>
    </ac:else>  
</ac:if>
  • Есть три случая;
    1. Аргумент не может быть определен. Муравей должен идти первым
    2. Аргумент определен хорошо.
    3. Аргумент определен с неверным путем

Для 2-го случая скрипт работает. Для третьего случая скрипт работает. Но для 1-го случая я имею в виду, когда я не определяю аргумент maindir, ant действует как 3-й случай. Это моя проблема.

Почему муравей так себя ведет?

Ответы [ 2 ]

3 голосов
/ 15 июня 2011

Может быть, вы можете попробовать установить значение по умолчанию для аргумента?

<condition property="maindir" value="[default]">
    <not>  
        <isset property="maindir"/>
    </not>
</condition>
<echo message="${maindir}" />

Я попробовал это, и это работает, когда аргумент не передан, значение ${maindir} равно [default].

1 голос
/ 15 июня 2011

Похоже, есть две проблемы:

  1. В условии равенства для первого if, у вас есть @{maindir}. Если это не параметр макроса, он должен быть ${maindir}, таким же, как в остальной части вашего примера
  2. Если свойство не было установлено, оно не будет оцениваться ни для чего. Поэтому, если maindir не определен, ${maindir} будет иметь значение ${maindir}, а не пустую строку.

Самый простой способ решить эту проблему - заменить знак @ на знак $ и добавить оператор в начале, чтобы свойство по умолчанию имело значение:

<property name="maindir" value="." />

Это свойство по умолчанию будет соответствовать текущему каталогу, поэтому вы можете полностью исключить внешний if, так как он больше не понадобится. Свойства в ant доступны только для чтения, поэтому, если пользователь явно указывает значение (например, из командной строки), это значение будет использоваться вместо этого, и приведенная выше строка не будет иметь никакого эффекта - это будет иметь эффект, только если пользователь не указал не указывайте значение для maindir.

На самом деле, я думаю, что вы можете полностью избавиться от ant-contrib, выполнив следующее:

<property name="maindir" value="." />
<fail message="${maindir}/build.properties is not a valid path.">
    <condition>
        <not>
            <available file="${maindir}/build.properties" />
        </not>
    </condition>
</fail>
<property file="${maindir}/build.properties" />

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

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