Как перезаписать свойство в Ant?

Есть ли способ переназначить значение для задачи Ant property? Или есть другая задача для этой цели?


person Community    schedule 08.12.2009    source источник


Ответы (8)


В зависимости от того, как вы хотите использовать измененное свойство, вы можете использовать macrodefs.

Например, вместо того, чтобы писать следующее:

<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>
person Vladimir    schedule 10.12.2009

задача 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 предполагают неизменяемые значения свойств, а другие части нарушают это предположение.

person skaffman    schedule 08.12.2009
comment
Задача var особенно удобна для локальных переменных, например. in for loops (тоже задание от отличного ant-contrib). Однако одним из недостатков является то, что задача var не поддерживает атрибут местоположения. - person Andreas Kraft; 09.12.2009

Справедливости ради, есть хак, который позволяет изменять неизменяемые свойства муравья без каких-либо дополнительных библиотек (начиная с 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 -->

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

person Vadzim    schedule 31.10.2012

Свойства неизменяемы в ant.

Вас может заинтересовать ant-contrib от varзадача.

<var name="my_var" value="${my_property}" />

<echo>Addressed in the same way: ${my_var} and ${my_property}</echo>
person jamesh    schedule 08.12.2009

Начиная с Ant 1.8, вы можете использовать «локальную» задачу для изменения значения свойства в целевом объекте. Обратите внимание, что это НЕ изменяет значение глобального свойства с тем же именем, но это способ решить некоторые проблемы.

Видеть

http://ant.apache.org/manual/Tasks/local.html

person BPS    schedule 09.08.2012

Вы не можете изменить значение свойства в 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>.

person Dave Webb    schedule 08.12.2009

Свойства неизменяемы в ant. Но это не такое страшное ограничение, как может показаться. Существует целый класс языков программирования, в которых (большинство) переменных являются константами, и тем не менее они делают то, что называется «функциональным программированием».

Вы можете «изменить» значения, используемые разными задачами, извлекая новые, измененные свойства из старых или изменяя параметры при вызове задач с задачами subant или antcall. Если вы творческий человек, вы обычно можете найти способ решить свою проблему.

person Carl Smotricz    schedule 08.12.2009
comment
очень полезно, если вы приведете один пример и объясните больше. - person kailash gaur; 03.01.2014

Вот пример использования 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>
person Steven Moslin    schedule 17.08.2015