只要满足条件,就执行Ant任务

Jos*_*dax 35 ant

只有满足条件,我才需要在特定目标内执行Ant任务.

我找到了一种在目标级别定义条件的方法,但不是在任务级别.我还找到了一个实现IF任务的贡献.

我的问题是,您是否了解使用标准Ant任务实现此目标的任何方法?

更长的解释:我试图启动Tomcat服务器,以防它被停止.要检测它是否已停止,我使用以下代码:

<echo message="Checking whether Tomcat is running"/>
<condition property="tomcat.running">
  <socket server="${tomcat.host}" port="${tomcat.port}"/> 
</condition>
Run Code Online (Sandbox Code Playgroud)

所以我在这个目标中的下一个任务是一个exec任务,只有在${tomcat.running}为false 时才应该执行.正如我所说,我不想在目标中添加单个任务来使用unless属性.

Dav*_* W. 48

Ant目标可以具有可选ifunless子句.这意味着仅在设置属性时使用if子句执行任务,或者在unless1节中未设置任务.有趣的是,这if还是unless第检查首先执行任何相关的任务.

这意味着,只有满足特定条件时,才能在标准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>
Run Code Online (Sandbox Code Playgroud)

您指定希望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可以用于各种可选的任务罐,如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>
Run Code Online (Sandbox Code Playgroud)

现在,您可以使用Ant-Contrib任务,而无需担心它们是否安装在特定计算机上.您签出项目,并且您可以自动访问这些任务.


1.这是正确的,则if/unless如果一个属性设置条款检查和不true/ false这可能会导致很多混乱.我已经看到开发人员将属性设置为false或者no,然后想知道为什么目标实际上正在执行,因为该if子句设置为false.

  • 好吧,你是_creating_新目标,但这些目标不是你的用户自己会使用的目标.将它们视为_内部目标_.它确实使构建过程变得有点棘手,这也是人们喜欢Ant-Contrib的原因之一.Ant-Contrib任务的问题在于它们不是标准Ant的一部分,这通常意味着你必须告诉人们在构建你的项目之前安装Ant-Contrib.但是,如果按照我在答案的第二部分中所述的方式进行,那就不再是问题了. (2认同)

Jör*_*örg 10

由于版本1.9.1(*)ant支持在任何任务上以更细粒度的方式使用if-和unless-条件,如果在project元素中声明必要的命名空间.

(*)请使用最新版本的ant(撰写本文时为1.9.6),因为版本1.9.1包含了WRT这个新功能的缺陷,正如用户@Rebse所指出的那样.

在下面的示例中,您可以播放评论/取消注释属性...

<project name="test"
         xmlns:if="ant:if"
         xmlns:unless="ant:unless">

  <property name="is.good" value="hohoho"/>
  <!--property name="hide.base" value="boo"/-->

  <target name="foo">
     <echo unless:set="hide.base">${basedir}</echo>
     <echo if:set="is.good">GOOD</echo>
  </target>
</project>
Run Code Online (Sandbox Code Playgroud)

......并观察如下输出:

Buildfile: D:\test\ant\taskcondition\build.xml
foo:
     [echo] D:\test\ant\taskcondition
     [echo] GOOD
BUILD SUCCESSFUL
Total time: 191 milliseconds
Run Code Online (Sandbox Code Playgroud)

  • 有关此功能的官方Ant手册:https://ant.apache.org/manual/ifunless.html (2认同)

小智 5

如果你想要一个"if else"类型的实现:

<target name="test.if.tomcat.is.running">
      <condition property="tomcat.running" value="true" else="false">
          <socket server="${tomcat.host}" port="${tomcat.port}"/> 
      </condition>
</target>

<target name="my.target.running"
    if="${tomcat.running}"
    depends="test.if.tomcat.is.running">
...
</target>

<target name="my.target.ifnotrunning"
    unless="${tomcat.running}"
    depends="test.if.tomcat.is.running">
   .....
</target>
Run Code Online (Sandbox Code Playgroud)