web-dev-qa-db-ja.com

Antでプロパティを上書きする方法は?

Ant propertyタスクの値を再割り当てする方法はありますか?または、その目的に使用できる別のタスクはありますか?

29
Priya

変更したプロパティの使用方法に応じて、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>
11
Vladimir

ant-contrib'sVariableタスクはこれを行うことができます:

<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スクリプトの一部が不変のプロパティ値を想定し、他の部分がこの想定を破ると、お勧めできませんが、奇妙な副作用につながる可能性があります。

34
skaffman

正義のために、追加のライブラリなしで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 -->

他の人が述べたように、これはすべての標準的なアプローチが適合しないことが判明した後、注意して使用する必要があります。

22
Vadzim

プロパティはantでは不変です。

ant-contribvar task に興味があるかもしれません。

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

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

Ant 1.8以降、「ローカル」タスクを使用して、ターゲット内のプロパティの値を変更できます。これは、同じ名前のグローバルプロパティの値を変更しないことに注意してくださいが、いくつかの問題を解決する方法です。

見る

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

9
BPS

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>タスクに渡される属性の参照に使用されることに注意してください。

4
Dave Webb

プロパティはantでは不変です。しかし、それは見かけほどひどい制限ではありません。 (ほとんどの)変数が定数であるにもかかわらず、それらが実行されるプログラミング言語のクラスがあります。これは「関数型プログラミング」と呼ばれます。

異なるタスクが使用する値を「変更」するには、古いプロパティから新しいプロパティを変更するか、subantまたはantcallタスクでタスクを呼び出すときにパラメーターを変更します。創造力があれば、通常は問題を解決する方法を見つけることができます。

2
Carl Smotricz

Basenameコマンドでlocalを使用したサンプルを次に示します。 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>
0
Steven Moslin