Доступное задание в муравье
Могу ли я установить переменную в доступном теге, как это?
<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>