高级特性流程控制牛

来源:扬中家居装修网 发布时间:2021-09-06

Ant没有引入Shell,比Make少了许多麻烦,但是流程控制(Flow Control)也是不能少的,要不是没法完成复杂的任务的。Ant内置了一些简单的流程控制方法,另外我们可以从外部引入脚本语言实现复杂的流程控制。 Ant内置的流程控制方法

1. depends 在定义一个target的时候,通过depends指定依赖的target,那么在运行这个target之前,这些依赖的target必须都先通过:

target name=\"A\"/

target name=\"B\" depends=\"A\"/

target name=\"C\" depends=\"B\"/

target name=\"D\" depends=\"C,B,A\"/

那么,如果只是运行B,A会先被调用;只是运行C,A先被调用,接着是B,再才是C;运行D,A先被调用,接着是B,接着是C,最后是D,注意B和A都只会被调用一次而不是两次。

2.if和unless

在定义一个target的时候,通过if和unless指定依赖的属性。例如:

?xml version=\"1.0\" ?

project name=\"showFlow\" default=\"showLan\" basedir=\".\"

property name=\"isENU\" value=\"true\" /

property name=\"isCHS\" value=\"false\" /

!--property name=\"isJPN\" value=\"false\" /--

target name=\"showLan\" depends=\"showENU, showCHS, showJPN\"/

target name=\"showENU\" if=\"isENU\"

通过多种途径与用人单位联系 echo message=\"This is English\" /

/target

target name=\"showCHS\" if=\"isCHS\"

echo message=\"This is Chinese\" /

/target

target name=\"showJPN\" if=\"isJPN\"

echo message=\"This is Japanese\" /

/target

/project

只有在调用transENU之前,先定义了属性enu,那么这个Target就会被执行。注意是定义,不论给这个属性赋什么值都行。看一下结果:

unless与if相反,一旦该属性被赋值,那么这个Target就不会被执行。

3. condition

if和unless还是死的,要把相应的属性去掉或加上才能决定是否执行。用condition可以增加一点灵活性:

?xml version=\"1.0\" ?

project name=\"showFlow\" default=\"showLan\" basedir=\".\"

target name=\"showLan\"

property name=\"lan\" value=\"ENU\" /

condition property=\"isENU\"

equals arg1=\"${lan}\" arg2=\"ENU\" /

/condition

condition property=\"isCHS\"

equals arg1=\"${lan}\" arg2=\"CHS\" /

/condition

condition property=\"isJPN\"

equals arg1=\"${lan}\" arg2=\"JPN\" /

/condition

antcall target=\"showENU\" /

antcall target=\"showCHS\" /

antcall target=\"showJPN\" /

/target

target name=\"showENU\" if=\"isENU\"

echo message=\"This is English\" /

/target

target name=\"showCHS\" if=\"isCHS\"

echo message=\"This is Chinese\" /

/target

target name=\"showJPN\" if=\"isJPN\"

echo message=\"This is Japanese\" /

/target

/project

结果:

condition任务除了在满足条件时设置一个属性之外什么也不做。这些条件包括not, and, or, available, uptodate, os, equals, isset, checksum, http, socket, filesmatch, contains, istrue, isfalse, isreference。这个设置的属性就可以被用来在调用某个把该属性设置为if/unless的Target进行触发了。

使用脚本语言进行流程控制

使用Ant内置的流程控制,首先是很麻烦,其次是只能进行一些简单的if/unless判断,稍微复杂一点的循环遍历都没法做,对系统的调用更是无法完成。Ant没有自己定义一套脚本,而是引入外部脚本。Ant支持的脚本很多,从JavaScript, Python, Ruby, BeanShell, TCL,到JudoScript,甚至还可以自己定义脚本语言。可惜这岂不是要求又掌握一门语言吗?

下面讲讲怎么用算是比较常见的Mozilla JavaScript。

首先,从下载BSF,我用的是bsf 2.3.0;再到下载Rhino,我用的是Rhino1.5R3。把jar文件都放到安装目录\\lib目录下。

下面是一个简单的例子:

project name=\"showScript\" default=\"testScript\" basedir=\".\"

property name=\"tosplit\" value=\"Just A Test\" /

target name=\"testScript\"

script language=\"javascript\" ![CDATA[

a1 = lit(\" \");

echo = eateTask(\"echo\");

for (i = 0; i ngth; i++) {

tMessage(a1[i]);

ecute();

}

intln(\"Do you like this?\");

]] /script

/target

/project

结果:

从例子可以看到:

从例子可以看到:

1) script必须用script language=\"语言名称\"指明,脚本主体必须用![CDATA[ 和 ]] 包起来。

2) 变量s1是JavaScript中的string类型,跟Java中的String类没有关系,因此可以调用split方法。JavaScript的语法?可以查MSDN:

3) Rhino的功能很强大,除了可以JavaScript的语法之外,还可以通过调用Java的类库,这里只是简单调用了intln。实际上,可以象编Java程序写出大块的程序来,当然了,只是调用,能不能定义类?

4) project和self是两个预定义的对象。selft就是当前script任务本身。在当前的l中所有定义了name的对象包括属性、任务、Target都可以用这个名称来引用,比如这里的属性tosplit。这些对象要怎么样操作?查Ant 的JavaAPI,总之只要用Java怎么调这里就可以怎么调,只要你对Ant足够熟悉就行。

南京治男科医院哪家好
广东新标木门怎么样
柳州白癜风治疗哪家好
相关推荐
杜高犬拉肚子怎么办要怎么治疗位置

杜高犬拉肚子怎么办?要怎么治疗?杜高犬拉肚子怎么办?要怎么治疗? 12:23:47出处:络点击:458 ...[详细]

潮流饰家2022.06.12
杜高犬怎么养鸡骨头绝对不适合让杜高犬啃食位置

杜高犬怎么养 鸡骨头绝对不适合让杜高犬啃食杜高犬怎么养 鸡骨头绝对不适合让杜高犬啃食杜高犬怎么养,随着人们生活水平的提供,饲...[详细]

潮流饰家2022.06.12
松狮咬骨头的益处及重要性位置

松狮咬骨头的益处及重要性松狮咬骨头的益处及重要性 16:11:59出处:络点击:1831 导读: 不少养松...[详细]

潮流饰家2022.06.12
松狮吃什么美毛松狮美毛技巧位置

松狮吃什么美毛?松狮美毛技巧松狮吃什么美毛?松狮美毛技巧 15:43:47by 呦呦松狮对主人十分忠诚,对陌生人有着很强的戒备心。它们性...[详细]

潮流饰家2022.06.12
杜高犬多少钱一只杜高犬的价格行情及选购方位置

杜高犬多少钱一只?杜高犬的价格行情及选购方法介绍 09:50 来源:络 作者:络 ...[详细]

潮流饰家2022.06.12
杜高犬体味大吗如何保持杜高毛发的整洁位置

杜高犬体味大吗?如何保持杜高毛发的整洁?杜高犬体味大吗?如何保持杜高毛发的整洁?杜高犬是世界上有名的猎犬,非常凶猛,目前...[详细]

潮流饰家2022.06.12