2011-07-18 11 views
4

呼び出すマクロ定義タスクをいくつか用意していますが、タイムスタンプコードで呼び出しをラップしたいと思います。これは、antcallを使用してタスクがマクロ定義ではなくターゲットであった場合に簡単に実行できます。macrodefタスクを動的に呼び出すことができます

マクロフェードでも同じことができますか?

例:
"macrocall" ラインは、私が( "antcall" に似)を使用したいタスクの仮定の一種である

<target name="run.tests"> 
    <run.named.test name="macro1" /> 
    <run.named.test name="macro2" /> 
</target> 

<macrodef name="run.named.test"> 
    <attribute name="name" /> 
    <sequential> 
     <echoTime /> 
     <macrocall name="@{name}" /> 
     <echoTime /> 
    </sequential> 
</macrodef> 

<macrodef name="macro1"> 
</macrodef> 

<macrodef name="macro2"> 
</macrodef> 

答えて

0

であなたにMacro1のMacro2ではをラップではないのはなぜ"マクロコール"にはアンチコールを使用します。新しいmacro1、macro2ターゲットはそれぞれ独自のプロジェクトで実行されます(プロパティとrefは渡されますが、取り消されることはありません)。これは達成しようとしていることに応じて良いかもしれません。

私が知る限り、あなたが望むものを達成するための純粋なアリの方法はありません。動的にタスクを呼び出すことです。おそらく近くに来るにはいくつかの外のパッケージを見つける必要がありますが、おそらく醜いでしょう。

0

これは非常に遅い回答ですが、私はしばらくの間、まったく同じ問題に苦労していましたが、今すぐ解決策を考え出したので、私は貢献すると考えました。

まず最初に、私はAntのコードを新しいファイルにエコーした後、ファイルからマクロコードを呼び出すような非常にハッキリなことをしないで、Antだけでこれを行う方法がないと断言するのは安全だと思います。 。

とにかく、私はGroovy Ant taskを使用してGroovyコードを実行することにしました。ここに私が思い付いたものです:

<groovy> 
    ant."${properties["macrodef.name"]}"("dir":properties["dir"]) 
</groovy> 

説明:

からant.は、単純にAntタスクを実行するためのGroovyを伝えるための接頭辞です。たとえば、ant.echo()<echo>タスクを実行します。

- "${properties["macrodef.name"]}"は、 "macrodef.name"という名前のプロパティをAntプロジェクトから取得します。

- 上記の2つを組み合わせると、Groovyに、プロパティ "macrodef.name"の値と同じ名前のAntタスクを実行するように指示しています。たとえば、Antプロジェクトの${macrodef.name}が現在 "compile"の値を保持している場合、Groovyはこの行をant.compileと読みます。

- ("dir":properties["dir"])は、 "dir"とも呼ばれるAntプロパティの値を使用して、属性 "dir"を持つマクロ定義を実行するようにGroovyに指示します。私のmacrodefがこの属性を必要とするからです。 Antでは、次のようになります:<compile dir="${dir}" />

私はこれを見ている人に役立つことを願っています!レコードに関しては、より一般的な<script>タスクを使用しないようにしました。明らかに、基本AntやGroovyタスクよりもはるかに遅く実行されるからです。理想的な解決策は、おそらくカスタムAntタスクを実際に作成することですが、あいにく未だにそれを行うにはあまり知識がありません。

0

動的

1 macrodef名を解決するには2つの方法があります)Macrodef名は「何ツー言う」変数に応じて、ロード時間中に一定と解決されません。その結果、一つだけmacrodefは「言う-何かを」名前を取得し、そこにもう一つの名前が解決されていません(コールするのは利用できません)

<property name="what-to-say" value="bye"/> 

<property name="say-${what-to-say}" value="say-something"/> 

<macrodef name="${say-hi}"> 
     <sequential> 
      <echo>hi!</echo> 
     </sequential> 
</macrodef> 
<macrodef name="${say-bye}"> 
     <sequential> 
      <echo>bye!</echo> 
     </sequential> 
</macrodef> 

<target name="test"> 
    <say-something/> 
</target> 

2)例えば、macrodef定義を持つ2つの追加ファイルを作成します。

​​

そして、あなたのメインプロジェクトに一つだけそれらの含ま

<property name="what-to-say" value="bye"/> 

<import file="macrodefs-${what-to-say}.xml"/> 

<target name="test"> 
    <say-something/> 
</target> 
関連する問題