我希望有一个'主'蚂蚁目标,它依赖于多个“工人目标”,(每个目标都做得很好)
但是,我想有条件地执行“主”目标,即如果不满足条件则不执行“工人”子目标
(特别是,主目标创建并填充数据库。子目标创建模式,填充表等。主目标中的最后一步留下标记文件以指示“数据库创建一次。”在后续运行中,该过程不应该尝试创建数据库。
如何以“antish”(即没有“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和unless属性仅启用或禁用 它们所附着的目标。他们不控制是否 目标条件目标依赖于执行。事实上, 他们甚至没有得到评估,直到目标即将到来 已执行,其所有前任已经执行。
我可以通过向所有“工作人员目标”添加“除非”条款来编写rpoblem代码,但我们希望避免重复。
另外,我使用如下的antcall,但更愿意避开蚂蚁世界的“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>
感谢