码迷,mamicode.com
首页 > 其他好文 > 详细

使用Gradle构建你的项目

时间:2015-08-28 23:28:20      阅读:510      评论:0      收藏:0      [点我收藏+]

标签:

为什么学习Gradle

1.         配置清晰,简单易懂

2.         Maven的配置文件更加简洁

3.         强大的Groovy脚本的支持

4.         有上面3个理由就够了

 

 

学习Gradle的入口
就像学习SpringMvc一样,首先要找到web.xml中是怎么配置的,然后才能找到各个相关的配置文件,然后具体怎么配置再一个一个的查看。

Gradle的主配置文件叫build.gradle ,其他配置文件还有setting.gradle.等等,一般还可以衍生出gradle.bat等方便的工作脚本.

关于这些gradle的脚本文件 以及常用的配置 ,作为参考后面统一罗列出来

 

Gradle 的java plugin

执行gradle build

 就会输出

:compileJava
:processResources
:classes
:jar
:assemble
:compileTestJava
:processTestResources
:testClasses
:test
:check
:build
 
BUILD SUCCESSFUL

这就是它的 java plugin

 

Gradle 项目的文件结构

简单的Gradle项目结构

Gradle-Project

 src

 resources

 build.gradle

 setting.gradle

多模块的Gradle项目结构

Project-Parent

 src

 resources

 module1

       src

       resources    

       build.gradle

       setting.gradle

 module2

       src

       resources

       build.gradle

       setting.gradle

 module3

       src

       resources

       build.gradle

       setting.gradle

build.gradle

setting.gradle

 

 

 

这是一个典型的 多模块Gradle项目.类似Maven的多Module项目。

同时子模块的定义在setting.gradle 中定义

setting.gradle

include ‘module1‘, ‘module2‘, ‘module3‘

 

相关子项目的build.gradle 影响自己和自己的子项目,子项目自己的build.gradle 覆盖父级配置。举个例子:

Project-Parent 中的 build.gradle 定义了一个名为helloTask,当在Project-Parent 目录下执行gradle hello 的时候,子模块的名为helloTask 也会一同执行。


Gradle中的Task
gradle
task相比maven ant lvy task更为强大,可以 实现 代码+脚本 混合编写,虽然task可以掺杂进来Groovy代码,但是这并不代表这 会影响了GradleTask的扩展。

 

Task的定义

build.gradle 中 添加下面的内容,就完成了定义一个Task

task helloworld{
  println “Hello World”

}

Task的方法与属性

task其实是一个对象,它也会有方法和属性,同时,也会有类型。默认情况下,定义的task继承自DefaultTask

设置默认任务

defaultTasks ‘first‘, ‘second‘

 

task first {

    doLast {

        println "I am first"

    }

}

task second {

    doFirst {

        println "I am second"

    }

}

 

在gradle命令后不加入任何任务名时,就会执行默认任务。

Task 中的 << 操作符

在有的Gradlebuild.gradle 文件中,会看到有的Task 定义的时候 Task名称后面还跟着一个 << 这样的符号,这其实 源于 Groovy << 的重写 ,a在定义一个Task 时后面跟1 <<

表示 把当前这个 Task 加入到执行任务列表的末尾

 

task initializeDatabase

initializeDatabase << { println ‘connect to database‘ }

initializeDatabase << { println ‘update database schema‘ }

initializeDatabase { print ‘configuring‘ }

initializeDatabase { println ‘database connection‘ }

执行gradle initializeDatabase 命令

输出:

print ‘configuring‘

println ‘database connection‘

println ‘connect to database‘

println ‘update database schema‘

 

 

另一段代码

// Initial task definition (maybe not easily editable)

Task setupDatabaseTests << {

    println ‘load test data‘

}

// Our changes to the task (in a place we can edit them)

setupDatabaseTests {

    doFirst {

        println ‘create database schema‘

    }

    doFirst {

        println ‘drop database schema‘

    }

}

说明:

第一个 setupDatabaseTests << 定义一个Task,当前这个Task执行堆里面的最后一个位置,也是第一个位置的执行体 负责 输出’load test data’

在下面的 setupDatabaseTests { ..} 中定义的 第doFirst 指明把当前负责的内容加到 执行堆的最后一个位置. 如果这时候执行 gradle setupDatabaseTests  就会输出 ‘create …load …’

在下面的 setupDatabaseTests { ..} 中定义的 第doFirst 指明把当前负责的内容加到 执行堆的最后一个位置.

当执行整个计划的时候,当然 是从 堆顶 一个一个的pop的执行了

Task depends

task task1{

 println ‘Task1‘

}

task task2(dependsOn:task1){

 println ‘Task2‘

}

执行gradle task2
输出

Task1

Task2

 

task task3{

 println ‘Task3‘

}

task task4{

 println ‘Task4‘

}

task task5(dependsOn:[task3,task4]){

 println ‘last Task‘

}

执行gradle task5
输出

Task3

Task4

last Task

 

Task类型

build.gradle
class HelloWorldTask extends DefaultTask {

    @Optional

    String message = ‘I am davenkin‘

 

    @TaskAction

    def hello(){

        println "hello world $message"

    }

}

task hello(type:HelloWorldTask)

task hello1(type:HelloWorldTask){

   message ="I am a programmer"

}

 

在本例中,就是 在 当前配置文件内,写了一段 Groovy 代码,可以看到在Task的参数内通过加入type 参数来灵活的切换 当前Task的实现

 

Copy

task copyFiles(type: Copy) {

    from ‘resources‘

    into ‘target‘

    include ‘**/*.xml‘, ‘**/*.txt‘, ‘**/*.properties‘

}

Jar

apply plugin: ‘java‘

task customJar(type: Jar) {

    manifest {

        attributes firstKey: ‘firstValue‘, secondKey: ‘secondValue‘

    }

    archiveName = ‘hello.jar‘

    destinationDir = file("${buildDir}/jars")

    from sourceSets.main.classes

}

JavaExec

apply plugin: ‘java‘

repositories {

    mavenCentral()

}

dependencies {

    runtime ‘commons-codec:commons-codec:1.5‘

}

task encode(type: JavaExec, dependsOn: classes) {

    main = ‘org.gradle.example.commandline.MetaphoneEncoder‘

    args = "The rain in Spain falls mainly in the plain".split().toList()

    classpath sourceSets.main.classesDir

    classpath configurations.runtime

}

 

Gradle自定义Task

build.gradle 中定义

class HelloWorldTask extends DefaultTask {

    @Optional

    String message = ‘I am davenkin‘

 

    @TaskAction

    def hello(){

        println "hello world $message"

    }

}

 

task hello(type:HelloWorldTask)

 

 

task hello1(type:HelloWorldTask){

   message ="I am a programmer"

}

在上例中,我们定义了一个名为HelloWorldTask的Task,它需要继承自DefaultTask,它的作用是向命令行输出一个字符串。@TaskAction表示该Task要执行的动作,即在调用该Task时,hello()方法将被执行。另外,message被标记为@Optional,表示在配置该Task时,message是可选的。在定义好HelloWorldTask后,我们创建了两个Task实例,第一个hello使用了默认的message值,而第二个hello1在创建时重新设置了message的值。


在项目中定义

package davenkin

import org.gradle.api.*

import org.gradle.api.tasks.*

 

class HelloWorldTask extends DefaultTask {

    @Optional

    String message = ‘I am davenkin‘

 

    @TaskAction

    def hello(){

        println "hello world $message"

    }

}

这里,我们将HelloWorldTask定义在了davenkin包下,因此在build.gradle文件中引用该Task时,我们需要它的全名称:

task hello(type:davenkin.HelloWorldTask)
task hello1(type:davenkin.HelloWorldTask){
    message ="I am a programmer"
}

在单独的项目中定义

http://www.cnblogs.com/CloudTeng/p/3421934.html?utm_source=tuicool

 

Gradle 中一些 内置变量

${ name}

${path}

 

def  Afile = file(‘..’) 
Afile.file();
def  Afiles = files(‘..’)
 Afiles.fileslist();

Gradle 守护进程

执行gradle命令时加上--daemon参数,或者-m参数。中止Gradle守护进程的方法是执行gradle -stop命令。

Gradle的项目属性

Gradle在默认情况下已经为Project定义了很多Property,其中比较常用的有:

project:Project本身

name:Project的名字

path:Project的绝对路径

description:Project的描述信息

buildDir:Project构建结果存放目录

version:Project的版本号

配置文件式定义

在项目目录下新建一个纯文本文件:gradle.properties。在此文件中写入键值对,就可以了。

·      从其它构建文件读取配置信息

·         build.gradle 
apply from: ‘other.gradle‘

·         other.gradle 
println “configuring $project” 
task hello ? {

·         println ‘hello from other script‘

}

·      判断项目中是否有设置某个属性

hasProperty(‘propertyName‘)

Gradle常用命令

执行gradle properties

执行gradle tasks

执行gradle --daemon

执行gradle build

执行gradle jar

执行gradle war

Gradle参考配置文件实例

使用Gradle构建你的项目

标签:

原文地址:http://my.oschina.net/httpssl/blog/498853

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!