property
Antタスクの値を再割り当てする方法はありますか? または、その目的のために利用できる別のタスクはありますか?
8 に答える
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 スクリプトの一部が不変のプロパティ値を想定し、他の部分がこの想定を破ると、おかしな副作用が生じる可能性がありますが、お勧めしません。
正義のために、追加のライブラリなしで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>
変更されたプロパティをどのように使用するかに応じて、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 1.8 以降、「ローカル」タスクを使用して、ターゲット内のプロパティの値を変更できます。これは、同じ名前のグローバル プロパティの値を変更するわけではありませんが、問題を解決する方法であることに注意してください。
見る
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
タスクを使用してタスクを呼び出すときにパラメーターを変更します。創造力があれば、通常は問題を解決する方法を見つけることができます。
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>