私は、次の4つの目標を持つ単純なビルドスクリプトがあるとします。Antでターゲットの依存関係の順序付けを行うためのエレガントな方法はありますか?
build
- コンパイルのプロジェクトのコードは、init
init
に依存 - 、ビルド環境を設定し、何もclean
に依存 -build
とinit
によって生成されたすべてのファイルを削除します。何も依存しません。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>
ここでの問題はinit
とclean
の順序はアリでは曖昧であるということです。 clean
が呼び出された場合は、init
を含む他のすべてのターゲットの前に実行する必要があります。ただし、clean
を必ず実行するとは限りませんので、init
にはdepends="clean"
を含めることはできません。私はall
ターゲットの依存関係(すなわちdepends="clean,build"
)にbuild
とclean
の順序を逆にすることは技術的には彼らがその順序で実行するようになるだろうことを実現
、しかし私は、これは満足のいく解決策であることを考慮していません。 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のターゲット依存リストがそのコア設計思想の一部として不変であると考え始めているので、実際にこの質問に対する良い答えはないかもしれません。
これは、ターゲットが誤った順序で実行されるのを確実に防ぎますが、最初に正しい順序でそれらを実行する方法をAntに指示する方法を探しています。つまり、このアサーションは意図したとおりに失敗する可能性がありますが、それでは何ですか? – CAustin
@CAustin ''の 'if'属性を使う別の例を追加しました。 –
私は努力を感謝しますが、これは基本的な論理的な問題を修正することなく、複雑さの小さな層を追加するだけです。 'all'の依存関係を切り替えると、まず' init'が呼び出されます。これは 'clean'に依存しますが、' run-clean'がまだ設定されていないため実行できません。私はターゲットが 'depends'属性にリストされている順序に完全に無関心な解決策を探しています。 – CAustin