2

複数の「ワーカーターゲット」に依存する「マスター」アリターゲットが必要です(それぞれが「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>

ありがとう

4

0 に答える 0