Ant 目标可以有一个可选的if
orunless
子句。if
这意味着仅当属性已设置、使用子句或未使用unless
子句1设置时才执行任务。有趣的是,在第一次执行任何相关任务后if
检查orunless
子句。
这意味着,您可以在标准 Ant 中执行此操作,作为仅在满足特定条件时执行 Ant 任务的一种方式:
<target name="test.if.tomcat.is.running">
<condition property="tomcat.running">
<socket server="${tomcat.host}" port="${tomcat.port}"/>
</condition>
</target>
<target name="my.target"
if="tomcat.running"
depends="test.if.tomcat.is.running">
<yaddah/>
<yaddah/>
<yaddah/>
</target>
您指定希望 Ant 执行 Target my.target
。Ant 注意到这my.target
取决于test.if.tomcat.is.running
目标,并将首先执行该目标。如果 Tomcat 实际正在运行,该test.if.tomcat.is.running
任务将设置该属性。tomcat.running
否则,不设置该属性。
最后,Ant 会回到my.target
目标,查看是否设置了属性tomcat.running
,只有设置了才会执行目标my.target
。
或者,您可以使用 Ant-contrib 任务,这可以使您的整个构建过程更容易理解。
如果你想走 Ant-Contrib 路线,有一个简单的方法来设置 Ant-Contrib,所以 Ant-contrib jar 实际上是你项目的一部分。如果有人从版本控制系统中签出您的项目,他们还将获得 Ant-contrib jar,因此不必自己安装 Ant-Contrib。
下载 Ant-Contrib jar,并将其放入项目根目录中名为antlib/ac
. 可antlib
用于各种可选任务 jar,例如Findbugs或 PMD。只需将每个可选的 Ant jar 放在它们自己的目录下antlib
(就像我把 Ant-Contrib 放在目录下一样ac
)。
然后,在您的 中build.xml
,您以这种方式指定 Ant-Contrib 任务:
<taskdef resource="net/sf/antcontrib/antlib.xml">
<classpath>
<fileset dir="${basedir}/antlib/ac"/>
</classpath>
</taskdef>
现在,您可以使用 Ant-Contrib 任务,而不必担心它们是否安装在特定机器上。您签出您的项目,并且您可以自动访问这些任务。
1.没错,该if/unless
子句检查是否设置了属性而不是true
/false
可能会引起很多混乱。我见过开发人员将属性设置为false
or no
,然后想知道为什么目标实际上正在执行,因为if
子句设置为 false。