内容简介:Gradle学习(十七)——Ant操作
简介
Gradle提供了与Ant的完美集成,你可以在Gradle构建中使用单个Ant任务或者全部由Ant构建。在Gradle的构建脚本里写Ant要比原来在xml中更加的简易而且还强力,强大到你可以把Gradle只是Ant的脚本工具
Ant可以分为两层:第一层是Ant的语言,他为 build.xm
l文件,目标的处理和宏的特殊构造提供了语言,可以说除了任务和类型之外的一切。Gradle支持Ant的语言,你可以直接把 build.xml
文件导入到Gradle项目,然后你就是像使用Gradle的task那样,使用Ant构建的target。第二层是Ant丰富的task和type,比如javac, copy or jar。对于这一层Gradle委托给了Groovy强力的AntBuilder。
还有,因为Gradle脚本是Groovy语言的,因此你可以把ant当做是外部程序, "ant clean compile".execute()
这样的脚本可以直接执行。
你可以把Gradle对Ant的集成当做是Ant构建迁移到Gradle的一种途径。你可以把导入Ant构建当做你的第一步,然后你把Ant中的依赖转移到构建脚本中,最后你可以一步步的用Gradle的插件来替换你Ant中的target,task和type,迁移可以分步来,整个过程Gradle都是可用的。
构建中使用Ant的task和type
在构建脚本中,有个指向 AntBuilder
实例的引用 ant
,可以用过它来访问Ant的任务,类型和属性。通过调用 ant
上的方法你可以执行Ant的任务,你可以把Ant任务名当做 ant
的方法名来使用,比如 ant.echo()
其实是调用Ant的echo任务。Ant任务的属性通过 ant
任务Map类型的参数传入,可以看看下面这个例子:
task hello { doLast { ant { echo message: 'hello from Ant' } } }
执行任务:
± % gradle hello > Task :hello [ant:echo] hello from Ant BUILD SUCCESSFUL in 1s 1 actionable task: 1 executed
还可以当做是嵌套的文本当做参数传入进行(上个例子可以用 <echo message='hello from Ant'></echo>
表示,嵌套就是 <echo>hello from Ant</echo>
),比如:
task hello { doLast { ant { echo 'hello from Ant' } } }
执行任务
± % gradle hello > Task :hello [ant:echo] hello from Ant BUILD SUCCESSFUL in 1s 1 actionable task: 1 executed
嵌套的元素则用闭包的方式传入:
task zipTask { doLast { ant { zip(destfile: 'archive.zip') { fileset(dir: 'src') { include name: '**.txt' exclude name: '**.java' } } } } }
你还可以以访问Ant任务的方式访问它的属性,也就是类型名换成方法名,方法返回的数据你可以直接就在脚本中使用它:
task listPath { doLast { def path = ant.path { fileset(dir: 'src', includes: '**.txt') } path.list().each { println it } } }
在构建中使用自定义任务
如果想要在脚本中自定义Ant任务,可以使用 taskdef
和 typedef
,就像你在 build.xml
文件做的那样。然后你就可以像使用ant自带的任务那样使用自定义的任务
task check { doLast { ant.taskdef(resource: 'checkstyletask.properties') { classpath { fileset(dir: 'libs', includes: '*.jar') } } ant.checkstyle(config: 'checkstyle.xml') { fileset(dir: 'src') } } }
你还可以使用Gradle的依赖管理来给Ant自定义任务使用的classpath,只需要在,只需要为classpath添加个自定义的配置,然后就可以在这个配置上添加依赖了。
configurations { pmd } dependencies { pmd group: 'pmd', name: 'pmd', version: '4.2.5' }
想使用这个classpath,只需要在这个自定义的配置上使用 asPath
属性就可以了
task check { doLast { ant.taskdef(name: 'pmd', classname: 'net.sourceforge.pmd.ant.PMDTask', classpath: configurations.pmd.asPath) ant.pmd(shortFilenames: 'true', failonruleviolation: 'true', rulesetfiles: file('pmd-rules.xml').toURI().toString()) { formatter(type: 'text', toConsole: 'true') fileset(dir: 'src/main/java') } } }
Ant构建导入
你可以使用 ant.importBuild()
把Ant的构建导入到Gradle的构建之中,导入之后Ant的每个target都变成了Gradle的一个task,这样你就可以像Gradle的任务那样操作Ant的target
Gradle导入Ant:
ant.importBuild 'build.xml'
build.xml
<project> <target name="hello"> <echo>Hello from Ant build.xml</echo> </target> </project>
执行任务:
± % gradle hello > Task :hello [ant:echo] Hello from Ant build.xml BUILD SUCCESSFUL in 1s 1 actionable task: 1 executed
你还可以用Ant的target添加依赖:
ant.importBuild 'build.xml' task intro(dependsOn: hello) { doLast { println 'Hello from Gradle' } }
执行任务:
± % gradle intro > Task :hello [ant:echo] Hello from Ant build.xml > Task :intro Hello from Gradle BUILD SUCCESSFUL in 1s 2 actionable tasks: 2 executed
还可以给Ant的target添加action
hello { doLast { println 'Action from Gradle' } }
执行任务:
± % gradle hello > Task :hello [ant:echo] Hello from Ant build.xml Action from Gradle BUILD SUCCESSFUL in 1s 1 actionable task: 1 executed
Ant的target还可以反过来依赖Gradle声明的任务
task intro { doLast { println 'Hello from Gradle' } }
build.xml:
<project> <target name="hello" depends="intro"> <echo>Hello from Ant build.xml</echo> </target> </project>
执行任务:
± % gradle hello > Task :intro Hello from Gradle > Task :hello [ant:echo] Hello from Ant build.xml Action from Gradle BUILD SUCCESSFUL in 2s 2 actionable tasks: 2 executed
有时候你可能需要对Ant的target进行重命名,以防止和Gradle的任务有冲突。使用 AntBuilder.importBuild(java.lang.Object, org.gradle.api.Transformer)
方法即可。
ant.importBuild('build.xml') { 'a_'+it }
build.xml:
<project> <target name="hello"> <echo>Hello from Ant build.xml</echo> </target> </project>
执行任务:
± % gradle a_hello > Task :a_hello [ant:echo] Hello from Ant build.xml Action from Gradle BUILD SUCCESSFUL in 0s 1 actionable task: 1 executed
这里有两点需要注意,重命名之后连被Ant依赖Gradle的任务也被重命名了,也就是build.xml里的任务也被重命名了,不知道这算不算一个bug。
第二点需要说明的是虽然 AntBuilder.importBuild(java.lang.Object, org.gradle.api.Transformer)
的不是闭包,但是Groovy语言的闭包可以自动转换SAM。
Ant的属性和引用
有多种方法可以设置Ant的属性,这些属性可以被Ant任务使用。可以通过AntBuilder的实例进行直接设置,还可以通过Ant的property属性,这个属性是个可以更改的Map,还可以通过ant的 property
任务进行设置,如下:
ant.buildDir = buildDir ant.properties['buildDir'] = buildDir ant.properties.buildDir = buildDir ant.property name: 'buildDir', location: buildDir
build.xml
<project> <target name="hello"> <echo>Hello ${buildDir}</echo> </target> </project>
大多数Ant任务在运行时才为属性设置值,获得这些属性值的方法有很多种,可以通过 AntBuilder
实例去获取:
build.xml
<project> <target name="hello"> <echo>Hello ${buildDir}</echo> </target> <property name="antProp" value="a property defined in an Ant build"/> </project>
build.gradle
println ant.antProp println ant.properties['antProp'] println ant.properties.antProp
设置Ant引用的几种方法:
ant.references['classpath'] = ant.path location: 'libs' ant.references.classpath = ant.path location: 'libs' ant.path(id: 'classpath', location: 'lib')
build.xml
<path refid="classpath"/>
获取Ant引用的方法
println ant.references['myPath'] println ant.references.myPath
build.xml
<path id="myPath" location="libs"></path>
要注意的是id既可以获取也可以设置,但是refid只能获取
Ant日志
Gradle将Ant的消息优先次序映射到了Gradle的日志级别中,映射关系如下:
Ant的消息优先次序 | Gradle的日志级别 |
---|---|
VERBOSE | DEBUG |
DEBUG | DEBUG |
INFO | INFO |
WARN | WARN |
ERROR | ERROR |
Ant的消息优先次序映射到了Gradle的日志级别有时候会出现问题,Ant没有对应的消息有限次序可以映射到Gradle的默认日志级别LIFECYCLE中,Ant的大多数任务都是INFO级别的,转换成Gradle的日志也会是INFO级别的,这样会输出的日志会比你预想要多很多。
反之,如果想让Ant的日志的消息优先次序高一点,那么就需要构建运行在一个更高级别的日志级别上,比如 QUIET
,但是想要的信息又被屏蔽掉了。
为了解决这个问题,Gradle允许用户对Ant的消息优先次序进行微调并设置映射到Gradle的日志级别。主要是通过 AntBuilder.setLifecycleLogLevel(java.lang.String)
来设置可以映射到LIFECYCLE日志级别对应的Ant的消息优先次序。如果这个值被设置,那么对应的消息游戏次序以上的日志将被记录,LIFECYCLE以上的日志也被记录。注意一点这个值最低都要设置成INFO的。如下面的例子:
ant.lifecycleLogLevel = 'INFO' task hello { doLast { ant.echo level:'info',message:'hello from into info' } }
执行任务
± % gradle hello > Task :hello [ant:echo] hello from into info BUILD SUCCESSFUL in 1s 1 actionable task: 1 executed
以上所述就是小编给大家介绍的《Gradle学习(十七)——Ant操作》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- Gradle学习(十六)——文件操作
- 小白如何学习操作系统?
- 操作系统学习笔记-8:线程
- 操作系统学习笔记-7:进程通信
- jQuery源码学习:异步操作--Callbacks
- git场景操作学习教程(三)
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。