Есть ли способ переназначить значение для задачи Ant property
? Или есть другая задача для этой цели?
Как перезаписать свойство в Ant?
Ответы (8)
В зависимости от того, как вы хотите использовать измененное свойство, вы можете использовать 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>
задача ant-contrib 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 предполагают неизменяемые значения свойств, а другие части нарушают это предположение.
Справедливости ради, есть хак, который позволяет изменять неизменяемые свойства муравья без каких-либо дополнительных библиотек (начиная с 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 -->
Как уже упоминалось, это следует использовать с осторожностью после того, как все канонические подходы оказались не подходящими.
Свойства неизменяемы в ant.
Вас может заинтересовать ant-contrib от var
задача.
<var name="my_var" value="${my_property}" />
<echo>Addressed in the same way: ${my_var} and ${my_property}</echo>
Начиная с Ant 1.8, вы можете использовать «локальную» задачу для изменения значения свойства в целевом объекте. Обратите внимание, что это НЕ изменяет значение глобального свойства с тем же именем, но это способ решить некоторые проблемы.
Видеть
http://ant.apache.org/manual/Tasks/local.html
Вы не можете изменить значение свойства в Ant.
Если у вас есть задачи Ant, которые вы хотите запускать повторно, передавая разные значения, я рекомендую задачу macrodef
так как вы можете запускать один и тот же макрос, многократно передавая разные атрибуты.
Например:
<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>
.
Свойства неизменяемы в ant. Но это не такое страшное ограничение, как может показаться. Существует целый класс языков программирования, в которых (большинство) переменных являются константами, и тем не менее они делают то, что называется «функциональным программированием».
Вы можете «изменить» значения, используемые разными задачами, извлекая новые, измененные свойства из старых или изменяя параметры при вызове задач с задачами subant
или antcall
. Если вы творческий человек, вы обычно можете найти способ решить свою проблему.
Вот пример использования 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>