Подтвердить что ты не робот

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

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

4b9b3361

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

См

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

Ответ 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>