Доступное задание в муравье

Могу ли я установить переменную в доступном теге, как это?

<available file="${inf.root}/schema_params/@{componame}-schema.sql" 
   type="file" 
   variable="schema.file" />

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

<var name="schema.params.file" unset="true"/>
<property name="schema.params.file" value="false"/>
<var name="scripts.dir" unset="true"/>
<property name="scripts.dir" value="false"/>

в первой итерации, если schema.params.file, для scripts.dir задано значение true, если файлы существуют, в следующей итерации он не будет перебазирован, даже если файл не существует. так что я добавил выше code.but теперь всегда значения устанавливаются в ложь снова вышеуказанным кодом. Как я могу преодолеть проблему переопределения этих 2 schema.params.file, scripts.dir в каждой итерации?

<for list="${t1.@{componentname}}" param="installableid" delimiter="${line.separator}">
    <sequential>
        <available file="${infinys.root}/schema_params/@{componentname}-schema_params.sql" 
             type="file" 
             property="schema.params.file" />
        <available file="${stage.dir}/@{componentname}/@{installableid}/schema/install/scripts" 
             type="dir" property="scripts.dir"/>
        <if>
            <and>
                <equals arg1="true" arg2="${schema.params.file}" />
                <equals arg1="true" arg2="${scripts.dir}" />  
            </and>                      
            <then>
                <copy file="${infinys.root}/schema_params/@{componentname}-schema_params.sql"
                   todir="${stage.dir}/@{componentname}/@{installableid}/schema/install/scripts"
                   failonerror="false" />
                <move file="${stage.dir}/@{componentname}/@{installableid}/schema/install/scripts/@{componentname}-schema_params.sql" 
                      tofile="${stage.dir}/@{componentname}/@{installableid}/schema/install/scripts/schema_params.sql"
                      failonerror="false"/>
                <chmod file="${stage.dir}/@{componentname}/@{installableid}/schema/install/scripts/schema_params.sql" perm="775"/>
                <var name="schema.params.file" unset="true"/>
                <property name="schema.params.file" value="false"/>
                <var name="scripts.dir" unset="true"/>
                <property name="scripts.dir" value="false"/>  
            </then>
        </if>
    </sequential>
</for>

2 ответа

Решение

Могу ли я установить переменную в доступном теге, как это?

Да, ты можешь.

Имена макросов меняются с каждой итерацией. <var/> Задача - это просто способ сбросить и сбросить свойство в Ant. Это часть проекта Ant-Contrib. Вам не нужно сбрасывать и сбрасывать свойство:

<var name="schema.params.file" unset="true"/>
<property name="schema.params.file" value="false"/>

Вы можете сделать это в одном утверждении:

<var name="schema.params.file" value="false"/>

Их использование крайне не рекомендуется, так как оно нарушает идею неизменной собственности Ant. Тем не менее, я обнаружил, что я тоже использую <var/> много при прохождении <for/> петли и иногда <macrodef>, Новые версии Ant позволяют локализовать свойства, поэтому я подозреваю, что <var/> задание скоро больше не понадобится.

Еще одна вещь, которая может сделать вещи немного проще, это то, что вы можете использовать <if/> тесты с <available/>

<if>
    <then>
        <and>
            <available file="${infinys.root}/schema_params/@{componentname}-schema_params.sql" 
                type="file"/>
            <available file="${stage.dir}/@{componentname}/@{installableid}/schema/install/scripts" 
                type="dir"/>
        </and>
        <sequencial>
            ....
        </sequential/>
    </then>
</if>

Это может сделать ваш код немного чище и легче для понимания. Это также устранит необходимость отмены свойств в первую очередь.

Ant не позволяет перезаписывать свойства. Вы все еще можете использовать macrodef но это уже другая история (см. Как переписать свойство в Ant?).
То, что вы можете сделать, это переместить внутренности вашего цикла к отдельной цели, например (не могу понять, почему вы копируете файл в другое место и сразу же перемещаете его в другое место, поэтому я просто заменил это перемещение-копирование одной копией)

<target name="cycle-body">
    <available file="${schema.params.file.name}" type="file" property="schema.params.file" />
    <available file="${scripts.dir.name}" type="dir" property="scripts.dir"/>

    <if>
        <and>
            <equals arg1="true" arg2="${schema.params.file}" />
            <equals arg1="true" arg2="${scripts.dir}" />  
        </and>                     
        <then>
            <copy file="${schema.params.file.name}" 
                tofile="${scripts.dir.name}/schema_params.sql" failonerror="false"/>

            <chmod file="${scripts.dir.name}/schema_params.sql" perm="775"/>
        </then>
    </if>
</target>

и называть это как

<for list="${t1.@{componentname}}" param="installableid" delimiter="${line.separator}">
    <antcall target="cycle-body">
        <param name="schema.params.file.name" value="${infinys.root}/schema_params/@{componentname}-schema_params.sql" />
        <param name="scripts.dir.name" value="${stage.dir}/@{componentname}/@{installableid}/schema/install/scripts" />
    </acntcall>
</for>
Другие вопросы по тегам