Есть ли способ переназначить значение для задачи Ant property
? Или есть ли другая задача для этой цели?
Как переписать свойство в Ant?
Ответ 1
В зависимости от того, как вы хотите использовать измененное свойство, вы можете использовать macrodef
s.
Например, вместо написания следующего:
<target name="foo">
<echo message="${my_property}"/>
</target>
и не имея возможности вызвать ant foo
с другим сообщением, вы можете написать:
<macrodef name="myecho">
<attribute name="msg"/>
<sequential>
<echo message="@{msg}"/>
</sequential>
</macrodef>
<target name="foo">
<myecho msg="${my_property}"/>
<property name="my_property2" value="..."/>
<myecho msg="${my_property2}"/>
</target>
Ответ 2
ant -contrib's Variable
задача может сделать это:
<property name="x" value="6"/>
<echo>${x}</echo> <!-- will print 6 -->
<var name="x" unset="true"/>
<property name="x" value="12"/>
<echo>${x}</echo> <!-- will print 12 -->
Не рекомендуется, однако, это может привести к странным побочным эффектам, если части ваших сценариев Ant предполагают неизменные значения свойств, а другие части нарушают это предположение.
Ответ 3
Справедливости ради, есть хак, который позволяет изменять ant неизменяемые свойства без каких-либо дополнительных libs (с java 6):
<scriptdef name="propertyreset" language="javascript"
description="Allows to assign @{property} new value">
<attribute name="name"/>
<attribute name="value"/>
project.setProperty(attributes.get("name"), attributes.get("value"));
</scriptdef>
Использование:
<property name="x" value="10"/>
<propertyreset name="x" value="11"/>
<echo>${x}</echo> <!-- will print 11 -->
Как уже упоминалось, это следует использовать с осторожностью после того, как все канонические подходы оказались непригодными.
Ответ 4
Свойства неизменяемы в ant.
Вам может быть интересно ant-contrib var
задача.
<var name="my_var" value="${my_property}" />
<echo>Addressed in the same way: ${my_var} and ${my_property}</echo>
Ответ 5
Так как Ant 1.8, вы можете использовать "локальную" задачу, чтобы изменить значение свойства внутри цели. Обратите внимание, что это НЕ изменяет значение глобального свойства с тем же именем, но это способ решить некоторые проблемы.
См
Ответ 6
Вы не можете изменить значение свойства в Ant.
Если у вас есть несколько задач Ant, которые вы хотите многократно запускать в разных значениях, я рекомендую macrodef
task, как вы можете запустите один и тот же макрос, повторно передавая разные атрибуты.
Например:
<macrodef name="copythings">
<attribute name="todir"/>
<sequential>
<copy todir="@{todir}">
<fileset dir="${src}">
<exclude name='**/*svn' />
</fileset>
</copy>
</sequential>
</macrodef>
<copythings todir="/path/to/target1"/>
<copythings todir="/path/to/target2"/>
Обратите внимание, что ${property}
используется для ссылки на свойства, а @{attribute}
используется для ссылки на атрибуты, переданные в задачу <macrodef>
.
Ответ 7
Свойства неизменяемы в ant. Но это не так страшное ограничение, как может показаться. Там целый класс языков программирования, где (большинство) переменных являются постоянными, и все же они получают вещи, сделанные это называется "функциональным программированием".
Вы можете "изменять" значения, используемые различными задачами, путем получения новых, измененных свойств из старых или изменения параметров при вызове задач с задачами subant
или antcall
. Если вы креативны, вы обычно можете найти способ решить вашу проблему.
Ответ 8
Вот пример, использующий local с командой basename. Var-unset не работает для меня.
<for param="db-patches">
<path>
<fileset dir="${undeployed-files}" includes="**/ddl*.zip"/>
</path>
<sequential>
<local name="inpfile" />
<basename property="inpfile" file="@{db-patches}" suffix=".zip" />
<!-- unzip the patch -->
<unzip src="${undeployed-files}/${inpfile}.zip"
dest="${unzipped-patches}/${inpfile}" />
<move file="${undeployed-files}/${inpfile}.zip" tofile="${deployed-files}/${inpfile}.zip"/>
</sequential> </for>