[关闭]
@xtccc 2016-09-23T22:35:01.000000Z 字数 3625 阅读 5162

Gradle Tasks

给我写信
GitHub

此处输入图片的描述


Gradle




目录


1. Task


1.1 A Basic Task

安装好了Gradle之后,将 $GRADLE_HOME/bin 放入 $PATH 中,这样便可以直接使用gradle命令了。

在当前目录下创建文件 build.gradle,内容如下:

  1. // build.gradle文件
  2. task hello << {
  3. println 'Hello, World !'
  4. }

这里的action实例名为hello,我们可以通过直接调用该action,如下:

$ gradle -q hello
Hello, World !


1.2 Accruing Task Action Code

通过操作符 << 可以不断地为某个task积累action code

build.gradle文件

  1. // 声明名为`Hello`的Task
  2. task Hello
  3. // 下面开始accruing task action
  4. Hello << {
  5. print 'Hello'
  6. }
  7. Hello << {
  8. print ', '
  9. }
  10. Hello << {
  11. println 'Gradle !'
  12. }

调用task Hello 的过程:

  1. $ gradle -q Hello
  2. Hello, Gradle !


1.3 配置Task

build.gradle文件

  1. // 声明名为DB的Task
  2. task DB
  3. DB << { println 'start connecting ...'}
  4. DB << { println 'start updating database ...'}
  5. DB { println 'Configuring This Task ... ' } // 配置本task

调用这个task

  1. $ gradle -b build.gradle DB
  2. Configuring This Task ...
  3. :DB
  4. start connecting ...
  5. start updating database ...

从上面可以看出 定义task配置task 的区别。


1.4 查看所有的tasks

通过命令 gradle tasks ,可以看到当前项目所有的tasks。

如果我们的 build.gradle 文件的内容如下:

  1. task hello {
  2. println "Hello !"
  3. }
  4. task hi << {
  5. println "Hi !"
  6. }

运行 gradle tasks 命令的结果如下:
QQ20160212-0@2x.png-521.2kB


1.5 Gradle构建工作的生命周期

Gradle的一次构建过程,会经历三个生命周期,分别是:



参考: 生命周期

1.5 几种Task类型

Task的默认类型是DefaultTask,除此以外,还有其他几种类型。

1.5.1 Copy

Copy task将指定的文件复制到指定的目录下,如果目的目录不存在,则会自动创建该目录。

  1. task copyFiles(type: Copy) {
  2. from 'build/libs'
  3. into 'copyed_build'
  4. include '*.jar'
  5. }


1.5.2 JavaExec

对于一个Java类,我们可以配置一个task,在该task中指定mainclass和参数,然后调用这个类。

假设文件为ReadTextFile.scala:

  1. package cn.gridx.aws.s3
  2. import com.amazonaws.regions.{Regions, Region}
  3. import com.amazonaws.services.s3.AmazonS3Client
  4. import scala.io.Source
  5. object ReadTextFile extends App {
  6. if (args.length < 4) {
  7. Console.err.println("请输入 :
  8. [AccessKey] [SecreteKey] [Bucket名称] [文件路径]")
  9. System.exit(100)
  10. }
  11. val AccessKey = args(0)
  12. val SecreteKey = args(1)
  13. val BucketName = args(2)
  14. val Path = args(3)
  15. val s3 = new AmazonS3Client()
  16. s3.setRegion(Region.getRegion(Regions.US_EAST_1))
  17. val obj = s3.getObject(BucketName, Path)
  18. val in = obj.getObjectContent
  19. val text = Source.fromInputStream(in).getLines().mkString("\n")
  20. in.close
  21. Console.out.println("读取除的文本内容为:\n")
  22. Console.out.println(text)
  23. }



现在要调用这个文件的主类,并向其中传入4个参数,那么相应的task可以在文件build.gradle中这么定义:

  1. task runReadTextFile(type: JavaExec, dependsOn: 'classes') {
  2. main = 'cn.gridx.aws.s3.ReadTextFile'
  3. classpath = sourceSets.main.runtimeClasspath
  4. args 'xxxx', 'yyyy', 'gridx-tmp', 'my_obj_key'
  5. println '开始执行task [runReadTextFile]'
  6. }



还可以指定运行时加入classpath的依赖包:

  1. configurations {
  2. testRun
  3. }
  4. dependencies {
  5. testCompile 'junit:junit:4.11'
  6. compile 'com.typesafe.slick:slick_2.10:1.0.1'
  7. testRun 'org.slf4j:slf4j-api:1.6.4',
  8. 'mysql:mysql-connector-java:5.1.38'
  9. }
  10. task run(type: JavaExec, dependsOn: 'classes') {
  11. main = 'cn.gridx.scala.slick.mysql.Basic'
  12. classpath = sourceSets.main.runtimeClasspath
  13. classpath += configurations.testRun // 加入testRun的依赖包到classpath
  14. println '开始测试运行 slick'
  15. }


1.5.3 生成source jar

  1. task jarSources(type:Jar){
  2. from sourceSets.main.allSource
  3. classifier = 'source'
  4. }




2. Task依赖


  1. task hello << {
  2. print 'Hello'
  3. }
  4. task comma(dependsOn: hello) << {
  5. print ', '
  6. }
  7. // 通过执行`gradle -q world`,会自动先指定所依赖的tasks
  8. task world(dependsOn: comma) << {
  9. println 'World'
  10. }

运行结果:

  1. $ gradle -q world
  2. Hello, World




3. 构建Java项目


3.1 Java plugin及项目结构

构建Java项目时会使用到 java plugin,所有的Java代码都在目录src/main/java,项目结构如下:
QQ20160123-2@2x.png-98.1kB



build.gradle文件的内容如下:

  1. apply plugin: 'java'

它的意思是调用java plugin进行构建,它会自动调用一系列的tasks来构建Java项目。


3.2 构建命令

构建时,只需要运行命令gradle build即可,此时我们可以看到生成新的build目录:
QQ20160123-3@2x.png-235.6kB



除了生成.class文件外,还自动生成了打包文件Basic.jar。由于当前的目录是/Users/tao/IdeaProjects/Gradle/Basic,如果不进行任何配置的话,生成的Jar包的名称就是当前目录的名称。



在构建时,会发生以下事情:


3.3 清除命令

通过命令gradle clean,就可以将build目录清除了。


添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注