2016-07-21 3 views
0

私は、次の4つの目標を持つ単純なビルドスクリプトがあるとします。Antでターゲットの依存関係の順序付けを行うためのエレガントな方法はありますか?

  1. build - コンパイルのプロジェクトのコードは、init
  2. initに依存 - 、ビルド環境を設定し、何も
  3. cleanに依存 - buildinitによって生成されたすべてのファイルを削除します。何も依存しません。
  4. all - 単に削除してからビルドします.0に依存します。とbuild

    <project> 
        <target name="build" depends="init"> 
         <echo>Building the project</echo> 
        </target> 
    
        <target name="init"> 
         <echo>Setting up the build environment</echo> 
        </target> 
    
        <target name="clean"> 
         <echo>Deleting all generated files</echo> 
        </target> 
    
        <target name="all" depends="build,clean"> 
         <echo>Full build complete!</echo> 
        </target> 
    </project> 
    

ここでの問題はinitcleanの順序はアリでは曖昧であるということです。 cleanが呼び出された場合は、initを含む他のすべてのターゲットの前に実行する必要があります。ただし、cleanを必ず実行するとは限りませんので、initにはdepends="clean"を含めることはできません。私はallターゲットの依存関係(すなわちdepends="clean,build")にbuildcleanの順序を逆にすることは技術的には彼らがその順序で実行するようになるだろうことを実現

、しかし私は、これは満足のいく解決策であることを考慮していません。 Antは依然としてこれらのターゲットを依存ツリー上の兄弟であるとみなし、実際にこの順序を強制しません。

もちろん、別の「解決策」は、順番に<antcall/>タスクを使用して順序をハードコードすることです。これは私が最終的に取り返しのないものかもしれませんが、それは私が避けようとしているものです。

また、Gradleにはこの機能が組み込まれていることが分かっています(私には嫉妬しています)。しかし、現時点では私の会社のプロジェクトはAntで深く掘り下げられているため、切り替えは実際にはオプション。 -

EDITは、私が探しているものの種類のより良いアイデアを与えるために、ここで私はAntがよかった機能使用例を示します

<condition property="init.depends.list" value="clean" else=""> 
    <contains string="${ant.project.call-graph}" substring="clean" /> 
</condition> 

<target name="clean" /> 

<target name="init" depends="${init.depends.list}" /> 

をAntのbindtargetsタスクにマニュアルページを読んだ後に、私は、Antのターゲット依存リストがそのコア設計思想の一部として不変であると考え始めているので、実際にこの質問に対する良い答えはないかもしれません。

答えて

0

initcleanより前に実行されないようにしたい場合は、そして、あなたはフラグとして機能するようにプロパティを使用することができます。

<target name="init"> 
    <property name="init-called" value="true"/> 
</target> 

<target name="clean"> 
    <fail if="init-called" message="init ran before clean"/> 
</target> 

initもし実行clean前に、init-calledプロパティが設定され、<fail>タスクは、ビルドに失敗します。

allを2つのターゲット:enable-clean-targetinitに依存させることもできます。enable-clean-targetcleanターゲットのif属性によって使用されるプロパティを設定します:

<target name="enable-clean-target"> 
    <property="run-clean" value="true"/> 
</target> 

<target name="clean" if="run-clean"> 
    <!-- ... --> 
</target> 

<target name="init" depends="clean"> 
    <!-- ... --> 
</target> 

<target name="all" depends="enable-clean-target, init"> 
    <!-- ... --> 
</target> 

initターゲットが明示的cleanに依存しますが、enable-clean-targetは、以前のビルドで実行した場合cleanにのみ実行されます。

+0

これは、ターゲットが誤った順序で実行されるのを確実に防ぎますが、最初に正しい順序でそれらを実行する方法をAntに指示する方法を探しています。つまり、このアサーションは意図したとおりに失敗する可能性がありますが、それでは何ですか? – CAustin

+0

@CAustin ''の 'if'属性を使う別の例を追加しました。 –

+0

私は努力を感謝しますが、これは基本的な論理的な問題を修正することなく、複雑さの小さな層を追加するだけです。 'all'の依存関係を切り替えると、まず' init'が呼び出されます。これは 'clean'に依存しますが、' run-clean'がまだ設定されていないため実行できません。私はターゲットが 'depends'属性にリストされている順序に完全に無関心な解決策を探しています。 – CAustin

関連する問題