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

Есть ли способ переназначить значение для муравья property задача? Или для этого есть еще одна задача?

9 ответов

Решение

В зависимости от того, как вы хотите использовать измененное свойство, вы можете использовать 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>

муравей-вно - х 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-contrib's 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> задача.

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

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

Вот пример использования local с командой basename. Вар-унсет не работает для меня.

<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>

Есть несколько вариантов, которые вы можете сделать:

  1. Вместо &amp;lt;property/&amp;gt; вы можете использовать&amp;lt;var/&amp;gt; ant-contrib . При необходимости переменную можно переустановить.
  2. Используйте &amp;lt;local/&amp;gt; , который позволяет переустановить свойство в области «блока» (например, в цели).
  3. Использоватьscript(например, Groovy) внутри ant, который позволяет переустановить свойство:
      <taskdef name="groovy" classname="org.codehaus.groovy.ant.Groovy" classpath="path/to/groovy-all.jar" />
<groovy>
    properties.propertyName = "propertyValue"
</groovy>

Или определите такой макрос и используйте его:

      <taskdef name="groovy" classname="org.codehaus.groovy.ant.Groovy" classpath="path/to/groovy-all.jar" />
<macrodef name="overwriteProperty">
    <attribute name="name" />
    <attribute name="value" />
    <sequential>
        <groovy>
            properties["@{name}"] = "@{value}"
        </groovy>
    </sequential>
</macrodef>

<overwriteProperty name="propertyName" value="propertyValue"/>
Другие вопросы по тегам