複数の「ワーカーターゲット」に依存する「マスター」アリターゲットが必要です(それぞれが「1つのことをうまく行う」)
ただし、「マスター」ターゲットを条件付きで実行したい、つまり、条件が満たされない場合は「ワーカー」サブターゲットを実行したくない
(具体的には、マスター ターゲットはデータベースを作成して入力します。サブターゲットは、スキーマを作成し、テーブルなどを入力します。マスター ターゲットの最後のステップでは、「データベースが一度作成された」ことを示すマーカー ファイルを残します。その後の実行では、プロセスは試行しないでください。データベースを作成します。
質問
これを「アンチ」(つまり、「antcall」なし)とDRY(同じことを繰り返さない)の両方の方法で実装するにはどうすればよいですか。
例
<target name="check-db-created">
<available file="db.created.marker.txt" property="db.already.created"/>
</target>
<target name="create-new-db"
unless="db.already.created"
depends="check-db-created,create-db-mssql,create-tables,compile-sp,disable-constraints.....">
</target>
<target name="create-db-mssql" >
..do stufff
</target>
コメント
問題は、「マスター」ターゲットを実行する必要がないにもかかわらず、「サブターゲット」(「create-db-mssql」、「create-tables」など) が実行されることです。Ant のドキュメントでは、これについて明確に説明されています。
重要: if および until 属性は、それらがアタッチされているターゲットのみを有効または無効にします。条件付きターゲットが依存するターゲットが実行されるかどうかは制御しません。実際、それらはターゲットが実行されようとするまで評価されず、そのすべての前任者はすでに実行されています。
すべての「ワーカー ターゲット」に「unless」句を追加することで、rpoblem を回避するコードを作成できますが、繰り返しは避けたいと考えています。
さらに、次のようにantcallを使用しますが、antの世界の「GOTO」は避けたいと思います。
<target name="create-new-db" depends="check-db-created"
unless="db.already.created">
<antcall target="create-new-db-internal"/>
</target>
<target name="create-new-db-internal"
depends="create-db,create-tables,compile-sp,disable-constraints,insert-base-data,insert-installer-generated-sql,insert-kb-data"
>
</target>
ありがとう