2011-07-14 21 views
5

エンドで常にターゲットを実行する方法はありますか?すべてのビルド?ant - すべてのビルドの最後にターゲットを実行する

<target name="runJob" depends="actuallyRunJob, teardown"/> 

私はこのような何かを行うことができます知っている

... ...しかし、私はティアダウンを必要とするすべてのターゲットのためのラッパーを必要があると思いますので、それは、ずさんです。

アイデア?私は同様の必要性を持っていたし、このようになりますカスタムタスク、書き込み終わった

おかげで、 ロイ

答えて

4

buildlistener、f.e.を使用します。各ビルド結果
ためTaskContainerの提供のexec-リスナー(ビルドが成功する| BUILDが失敗した)あなたが
にすべての必要なタスクを置くことができます
http://ant.apache.org/manual/develop.html =詳細
または独自のビルドリスナー、参照を転がしためConditional Task on exec failure in Antを参照してください
とBuildListener.html

0

:この場合

<!-- a task that executes the embedded sequential element at the end of the build, 
    but only if the nested condition is true; in this case, we're dumping out the 
    properties to a file but only if the target directory exists (otherwise, the clean 
    target would also generate the file and we'd never really be clean!) --> 
<build:whendone> 
    <condition> 
     <available file="${project_target-dir}" /> 
    </condition> 
    <sequential> 
     <mkdir dir="${project_final-build-properties-file}/.." /> 
     <echoproperties destfile="${project_final-build-properties-file}" /> 
    </sequential> 
</build:whendone> 

は、私はアリのすべてのレコードを望んでいましたビルドに寄与したプロパティは、ビルドの初期にそれを実行することはかなり(それらがファイルにダンプした後にターゲットの一部として初期化されていれば)かなり不足しています。

残念ながら、特定のコードを共有することはできませんが、これはSubBuildListener、具体的にはbuildFinished(BuildEvent)を実装するAnt Taskに過ぎません。リスナーは埋め込み条件をテストし、trueが埋め込みを実行する場合はsequentialを実行します。

もっと良い方法があるかどうかを知りたいです。

0

/アリAntのインストールからAPIドキュメント=
$ ANT_HOME /ドキュメント/マニュアル/ API /組織/ apacheの/ツール/それはあなたが簡単に "を上書きすることができますアンドロイドのプロジェクトだ場合 - ビルド後 "ローカルの" build.xmlのターゲット"ファイル。この目標は、この目的のためです。 Rebseの答えと同じ精神で

1

次のように(あなたがあなたのメイクファイルでいくつかのコードに対するAntの拡張を取引気にしない場合)、あなたはJavascriptでBuildListenerを書き込むことができます。

<project name="test-ant" default="build">               

<target name="init">                    
    <script language="javascript"> <![CDATA[              
     function noop() {}                  
     var listener = new org.apache.tools.ant.BuildListener() {        
      buildFinished: function(e) {               
       project.executeTarget("_finally");            
      },                     
      buildStarted: noop,                 
      messageLogged: noop,                 
      targetStarted: noop,                 
      targetFinished: noop,                
      taskStarted: noop,                 
      taskFinished: noop                 
     }                      
     project.addBuildListener(listener)              
    ]]></script>                     
</target>                      

<target name="build" depends="init"/>               

<target name="fail" depends="init">                
    <fail message="expected failure"/>               
</target>                      

<target name="_finally">                   
    <echo message="executing _finally target..."/>            
</target>                      

</project> 

が他のイベントをインターセプトあなたが見ることができるように非常に簡単でなければなりません。

+0

'script'がターゲットの内部にある場合、' buildStarted'と 'buildFinished'イベントは正常に起動できません。 'project'の直下に' script'を置くことで解決できます。 – Alex

関連する問題