30

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

4

8 に答える 8

34

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

于 2009-12-08T12:47:45.027 に答える
26

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

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

于 2012-10-31T05:54:51.540 に答える
12

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

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

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

<echo>Addressed in the same way: ${my_var} and ${my_property}</echo>
于 2009-12-08T12:49:15.013 に答える
11

変更されたプロパティをどのように使用するかに応じて、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>
于 2009-12-10T19:51:33.767 に答える
10

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

見る

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

于 2012-08-09T14:29:40.880 に答える
4

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>

于 2009-12-08T12:58:13.493 に答える
2

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

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

于 2009-12-08T12:54:56.033 に答える
0

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>
于 2015-08-17T19:46:16.677 に答える