转: ant condition使用

评注: 用c语言的方式来,比喻ant...比较好理解

转: http://www.smithfox.com/?e=176

[备忘] Apache Ant中的逻辑判断

[原创链接: http://www.smithfox.com/?e=176 转载请保留此声明, 谢谢!! ]

在写Ant时有时免不了要简单的逻辑, 本文并没有创造什么新的好办法, 只是着眼于将一些 "似懂非懂" 的概念理清一下.

相信第一次遇到这样的问题时, 你一定能搜索到很多的内容, 零散的concept进入了你的脑中: condition, if, else, else if, then, unless, avaliable, ant-contrib.

先不管这些, 看一段  程序员都能看懂的代码:

function test():void {
  if(  (a!=null && b=="hello") || ( fileExist("/good.txt") ) ) {
    printf("11111");
  } else {
    printf("33333");
  }
}

很显然上面这段代码很难直接体现在 Ant这样以XML为载体的描述式脚本中, 再改造一下:

function test():void {
  var flag:Boolean = conditaion( or( and(a!=null,b=="hello"), fileExist("/good.txt") ) );
  if( flag  ) {
    printf("11111");
  } else {
    printf("33333");
  }
}

为什么要这样改造, 因为对应的Ant是这样写的:

<?xml version="1.0" encoding="UTF-8"?>

<project name="anttest" default="printf11111">
	<!-- 这个Ant Project的默认target是printf11111, 为了使Ant能自动调用 printf33333将 printf33333 放到它的 depends -->
    <target name="printf1111" depends="getflag, printf33333" if="flag">
        <echo message="11111"/>
    </target>

    <target name="printf33333" depends="getflag" unless="flag">
        <echo message="33333"/>
    </target>

    <target name="getflag">
        <condition property="flag">
            <or>
		<and>
			<isset property="a"/>
			<equals arg1="${b}" arg2="hello" />
		</and>
		<available file="/good.txt" type="file"/>
            </or>
        </condition>
    </target>
</project>

你肯定会有两点感受: 一是,觉得这个真的很啰嗦, 二是, 这么多的新出来的字眼, 我到哪去找呀?

好吧, 先解决第二个问题, 给几个链接:

http://ant.apache.org/manual/Tasks/conditions.html

http://ant.apache.org/manual/targets.html

再看第一个问题, 在啰嗦中找点规律:

1. Ant的逻辑分支的粒度是 target, 因为 if 和 unless(作用相当于else) 是 target的属性

2. Ant的逻辑体现在 property(相当于变量)上, 因为 if 和 unless 只接受 property

3. condition这个task, 是逻辑组合器, 它的作用相当于: var flag:Boolean = (xxx);

你会发现写一个这么简单的东东, 都要搞好几个target, 主要还是因为: "Ant的逻辑分支持粒度是 target", 在Ant中比target小的粒度是 task, 那有没有task级别的 逻辑分支呢? 这时候 ant-contrib 就华丽登场了.

其实ant-contrib 重用了 Ant的conditions(不是condition task), 而废弃了 condition 这个 task, 代之以 if, else, elseif再加then 这样的task.

用 ant-conrib的例子如下:

<?xml version="1.0" encoding="UTF-8"?>

<project name="anttest" default="print">
	<property name="a" value="somevalue"/>
	<property name="b" value="hello"/>

	<taskdef resource="net/sf/antcontrib/antlib.xml" classpath="${basedir}/ant-contrib-1.0b3.jar" />

	<target name="print">
		<if>
			<or>
				<and>
					<isset property="a"/>
					<equals arg1="${b}" arg2="hello" />
				</and>
				<available file="/good.txt" type="file"/>
			</or>
			<then>
				<echo message="11111" />
			</then>
			<else>
				<echo message="33333" />
			</else>
		</if>
	</target>

</project>

你会发现用ant-contrib比直接用 ant内置的简洁多了, 而且可读性也增强了. 这主要是因为, if, else 这样的逻辑分支已经是 ant task 级别了.

[原创链接: http://www.smithfox.com/?e=176 转载请保留此声明, 谢谢!! ]

时间: 2024-10-15 23:45:49

转: ant condition使用的相关文章

ant condition

1.istrue isfalse:断言 真 假<project name="testCondition">    <target name="test">        <condition property="scondition">            <istrue value="true"/>                            </condit

ant使用总结(四):自定义库

自定义Condition 编写自定义的condition,可以实现自定义的条件判断逻辑,需要实现org.apache.tools.ant.taskdefs.condition.Condition接口,只有一个必须实现的方法就是eval,用于返回条件判断结果. 比如:实现一个用于判断一个字符串是否全部大写的Condition. 步骤: 1.新建Java工程 2.引入ant库 ant相关的jar就在apache-ant-1.9.4\lib目录下.在Java工程中新建一个libs目录,把jar包都拷贝

使用ant编译发布web项目

本文就不对ant进行详细介绍,直接对一个实际项目的自动构建和部署等进行说明. build.xml 内容主要分为2部分:项目编译库的配置 和 项目自动构建部署的编写 1.配置项目编译库classpath(文章底部贴出来的例子 build.xml 文件中,对编译库的配置写的不好,大家使用中参考下面这段代码这样写会比较清晰.) <!-- ClassPath configuration setting --> <!-- J2EE库 --> <path id="J2EE.li

ant的condition任务

1.istrue isfalse:断言 真 假 Xml代码 <project name="testCondition"> <target name="test"> <condition property="scondition"> <istrue value="true"/> </condition> <antcall target="isTrue&q

ant 脚本 available 及条件判断功能

1. 通过<available property="属性名"  file | classname | resource = "被判定是否存在的东西"  value="给属性名显示指定一个值" ..... /> 存在性判断语句,如果判定的东西存在,则以默认值true/或指定的属性值设置指定的属性:若判定的东西不存在,则不设置该属性. 我们可以根据这个属性是否被设置(通过<isset property="属性名"

ant扩展之if,for

Ant-contrib是使用Ant编写脚本最重要的补充.当使用Ant编写一些较为复杂的逻辑功能,比如循环和流程判断时,自然希望 Ant 能支持这种编程能力.然而 Ant 核心任务中并没有提供 <if> 任务,只是在 <target> 任务的属性中支持 if 属性,比如 <target name="targetA" if="property-A-present"/>,即表示只有 property-A-present 属性存在才执行t

Eclipse下配置Ant脚本 自己主动打包带签名的Android apk

尽管eclipse非常少用了,可是在古老的项目上还是会用到.一个麻烦事是打带签名包的时候.非常不方便.下边纪录下配置ant,自己主动打包带签名apk的过程,作为备忘.(PC环境为MAC) 1,第一步得安ant,下载相应安装包,解压后配置环境变量: export ANT_HOME="/Users/yanzi/work/apache-ant-1.9.4" export PATH=${PATH}:${ANT_HOME}/bin 通过which ant检查是否成功安装. 2,在项目文件夹下执行

jenkins / ant / jmeter 持续集成接口自动化

1. 将 jmeter 脚本放在/var/lib/jenkins/workspace/Jmeter_auto/jmxpath路径下 2. 点击http://jk.facebank.net.cn/job/Jmeter_auto/立即构建即可 最终生成的报告会在 /var/lib/jenkins/workspace/Jmeter_auto/jmxpath/时间目录/html/文件夹中,里面包含整个脚本运行的结果 jmeter 安装目录: /var/lib/apache-jmeter-3.0, ant

Ant 命令行编译Android项目

首先把android sdk下的tools目录加到系统path环境变量里, 要么就得直接指定android.bat的绝对路径 对于一个新项目, 可以用这个命令创建需要的ant编译环境(可以看到android项目默认的文件结构) android create project -k com.foo -a Test1 -t android-8 -p d:\temp 如果是已经存在的项目, 对主项目和子项目都运行 项目目录> android update project -s -p . -t andro