6

親愛なる、私は現在、foreachループで設定されたプロパティの値を取得するためのいくつかの問題に直面しています。多分あなたの一人が私を助けることができます...

目的は、対応するjarが生成されてから、フォルダーの1つのファイルが変更されているかどうかを確認することです。このようにして、jarを再度生成する必要があるかどうかを知ることができます。私がやっていることは、foreachループでフォルダーを調べ、1つのファイルが私のテストに一致する場合は、プロパティをtrueに設定することです。

問題は、ループの後に変数が存在しないように見えることです...同じ問題がある単純化されたコード例を次に示します。

<target name="target">
    <taskdef resource="net/sf/antcontrib/antlib.xml" classpath="${lib.dir}/ant-contrib.jar"></taskdef>
    <foreach target="setVar" param="var" list="a,b"/>
    <echo>myreturn in target: ${env.myreturn}</echo>
    <property name="env.myreturn" value="c"/>
    <echo>myreturn in second: ${env.myreturn}</echo>
</target>
<target name="setVar">
    <property name="env.myreturn" value="${var}"/>
    <echo>myreturn in setVar: ${env.myreturn}</echo>
</target>

このコードの結果は次のとおりです。

target:
setVar:
 [echo] myreturn in setVar: a
setVar:
 [echo] myreturn in setVar: b
 [echo] myreturn in target: ${env.myreturn}
 [echo] myreturn in second: c
BUILD SUCCESSFUL

「setVar」ターゲットに出力できるため、変数は正しく設定されているようですが、呼び出し元のターゲットから値を取得する方法はありません。

また、プロパティに値を2回割り当てることはできないことも知っています。しかし、問題は発生しません...その場合は、プロパティの値を割り当てる前にチェックを追加して、まだ初期化されていないことを確認できます...

私が私の問題を解決する方法についての手がかりがありますか?

よろしくお願いします:)

4

5 に答える 5

7

<for>の代わりにant-contribからタスクを試してください<foreach>。この<for>タスクは、後で登場したAntマクロ機能を利用します。以前のタスクよりも高速に動作し、柔軟性があり<foreach>ます。を使用するときは、同じプロジェクトコンテキストにいます<for>。つまり、ループに設定されたプロパティはループの外側に表示されます。もちろん、プロパティの通常のルールが適用されます...設定できるのは1回だけです... <var>ant-contribのタスクを使用して、以前に設定したプロパティを上書きまたは設定解除しない限り。

ああ、Antハッキングの喜び。

于 2011-03-17T02:12:11.480 に答える
3

foreachの問題についてはよくわかりませんが、要件に合わせて最新のタスクを使用することはできません

于 2011-03-16T12:43:06.890 に答える
3

sudocodeのおかげでもう必要なくなったとしても、私の質問に対する解決策を見つけました。多分それは他の誰かのために役立つかもしれません...

同僚がant-contribの「antcallback」ターゲットについて話しました。これにより、呼び出されたターゲットから呼び出し側のターゲットに結果を返すことができます。「for」ターゲットと「antcallback」を組み合わせることで、私がやりたかったことを実行できます。

<target name="target">
    <taskdef resource="net/sf/antcontrib/antlib.xml" classpath="${lib.dir}/ant-contrib.jar"></taskdef>
    <for param="file">
        <path>
            <fileset dir="../myDirectory" includes="**/*" />
        </path>
        <sequential>
            <antcallback target="setVar" return="retValue">
                <param name="file" value="@{file}"/>
            </antcallback>
        </sequential>
    </for>
    <echo>result: ${retValue}</echo>
</target>
<target name="setVar">
    <property name="retValue" value="${file}"/>
</target>

「file」には、ディレクトリ内のファイルの名前が含まれています。これは、値が「@ {file}」のパラメーターとして呼び出されたターゲットに与えられます(「for」ターゲットの実装のために「@」が必要です)。

メインターゲットの最後にある${retValue}には、「setVar」ターゲットによって設定された最初の値が含まれています。複数回設定しようとしてもエラーは発生しないため、「setVar」ターゲットに設定する前に、変数がすでにインスタンス化されているかどうかを確認する必要はありません。

于 2011-03-22T09:25:13.167 に答える
1

<foreach>タスクは内部と同じロジックを使用し、によって<antcall>呼び出されたターゲット内に設定されたプロパティには<antcall>、そのターゲットの実行を超えるスコープはありません。

つまり、ターゲットでenv.myreturn定義したプロパティは、setVarそのターゲットの実行が完了するとすぐに失われます。

この種のスクリプトは、実際にはAntが設計されたものではありません。Ant-contribライブラリは穴を修正しようとしますが、それでも形が崩れています。

このようなスクリプトを作成する必要があり、Antタスクを使用してスクリプトを実行する場合は、代わりにGradleを参照してください。これは、Groovy(スクリプト用)とAnt(タスク用)のかなり素敵なブレンドです。

于 2011-03-16T12:34:37.970 に答える
0

ここでの他のアプローチ(<for>、、、、、)はANT 1.9.4<var>では機能しなかったため、次のようなファイルシステム(擬似コード)を使用しました。<groovy>properties.put(....)</groovy><property><antcallback>

<target name="outer">
  <for>  <antcall target="inner" />  </for>
  <loadproperties srcfile="tmpfile.properties" />
  <echo message="${outerprop}" />
</target>

  <target name="inner">
    <!-- did not work: -->
    <!--
      <property name="outerprop" value="true" /> 
      <var name="outerprop" value="true" /> 
      <groovy>properties.put('outerprop','true')</groovy>
      <antcallback target="setouterprop" />
    -->
    <echo message="outerprop=true" file="tmpfile.properties" />
  </target>

たぶん他のアプローチは私のせいでうまくいきませんでしたが、<antcall>ここでそれが必要です。(outerprop最初は設定されていません)

于 2017-11-10T12:41:43.023 に答える