Gradle学习(十三)——构建脚本详解

原创 2018年01月05日 15:58:06

转载请注明出处:http://blog.csdn.net/lastsweetop/article/details/78982312

Gradle的构建语言

Gradle使用DSL来描述构建,是基于Grooy并在之上进行了扩展,以便更易于描述构建。Gradle可以支持Groovy除了label外的任何元素,脚本文件需要是UTF-8编码的

Project的Api

我们之前说过在Grale中是构建脚本定义了Project的构建,每个处于构建的Project,Gradle都定义了一个Project类型的对象,而构建脚本的执行就是在配置这个Project对象

  • 你在构建脚本中调用的任何未定义的方法,都会被委托给这个Project对象
  • 你在构建脚本中使用的任何未定义的属性,也是被委托给这个Project对象

我们试着访问下这个Project的name属性:

println name
println project.name

然后执行一下check任务

± % gradle check -q                                                       
writingBuildScripts
writingBuildScripts

两个println语句打印出了相同的属性。第一个因为属性未定义,就会自动委托给Project对象。第二个是用了任何脚本都可见的project对象,其实和第一种也一样都是委托给了Project对象,然后返回了自己。如果你已经定义了Project对象相同名字的属性,如果你还想使用Project对象属性,只能通过project对象了,也就是第二种方法。

标准的project属性

Project对象提供了一套标准的project属性,它们对于构建脚本来说都是可见的,以下是经常使用的Project属性的列表:

名字 类型 默认值
project Project Project对象
name String Project目录的名字
path String Project的绝对路径
description String Project的描述
projectDir File 包含构建脚本的目录
buildDir File projectDir/build
group Object unspecified
version Object unspecified
ant AntBuilder AntBuilder对象

Script的API

当Gradle运行构建脚本的时候,会把它先编译成实现了实现了org.gradle.api.Sript接口的类,这就意味着Script接口的所有属性可方法在构建脚本中都是可用的。

声明变量

有两种变量可用声明,一直是本地变量,还有一种是扩展属性。

本地变量

本地变量是Groovy的一个特性,按照Groovy的方法写就可以了。def或者特定的class开头,示例:

def dest = 'dest'
task copy(type:Copy) {
    from "source"
    into dest
}

扩展属性

在Gradle领域模型内的各种扩展对象,都可以使用用户定义的扩展属性,包括并不局限于projects,tasks,和source sets。扩展属性可以通过ext添加,读取或者设置。ext代码块可以一次添加多个扩展属性。示例:

ext {
    pluginVersion = "2.0"
    url = "www.lastsweetop.com"
}

sourceSets.all {
    ext.perpose = null
}

sourceSets {
    main {
        perpose = 'main'
    }
    test {
        perpose = 'test'
    }
    plugin {
        perpose = 'production'
    }
}

task printExtProperties {
    doLast {
        println pluginVersion
        println url
        sourceSets.matching {
            it.perpose == 'production'
        }.each {
            println it.name
        }
    }
}

然后执行printExtProperties任务:

± % gradle printExtProperties -q                                          
a
writingBuildScripts
2.0
www.lastsweetop.com
plugin

首先通过ext块给Project对象增加了两个属性,然后通过ext.purpose给每个sourceSet增加了purpose属性,一旦属性被添加,那么他们就可以像之前的属性一样被使用。

给对象添加的额外属性可以从任何可以访问到该对象的地方进行访问,当然子工程也可以访问root工程的属性。

配置任意对象

你可以使用下面这样可读性很好的方式去配置任意对象:

task configure {
    doLast {
        def pos = configure(new java.text.FieldPosition(10)) {
            beginIndex = 2
            endIndex = 3
        }
        println pos.beginIndex
        println pos.endIndex
    }
}

然后执行configure任务:

± % gradle configure -q                                                   
2
3

使用额外的脚本配置任意对象

示例:

task configure2 {
    doLast {
        def pos = new java.text.FieldPosition(10)
        apply from: 'pos.gradle', to: pos
        println pos.beginIndex
        println pos.endIndex
    }
}

pos.gradle文件如下:

beginIndex = 2
endIndex = 3

然后执行configure2任务:

± % gradle configure2 -q                                                  
2
3

默认导入包

下面这些包被默认导入到所有脚本中

import org.gradle.*
import org.gradle.api.*
import org.gradle.api.artifacts.*
import org.gradle.api.artifacts.cache.*
import org.gradle.api.artifacts.component.*
import org.gradle.api.artifacts.dsl.*
import org.gradle.api.artifacts.ivy.*
import org.gradle.api.artifacts.maven.*
import org.gradle.api.artifacts.query.*
import org.gradle.api.artifacts.repositories.*
import org.gradle.api.artifacts.result.*
import org.gradle.api.artifacts.transform.*
import org.gradle.api.artifacts.type.*
import org.gradle.api.attributes.*
import org.gradle.api.component.*
import org.gradle.api.credentials.*
import org.gradle.api.distribution.*
import org.gradle.api.distribution.plugins.*
import org.gradle.api.dsl.*
import org.gradle.api.execution.*
import org.gradle.api.file.*
import org.gradle.api.initialization.*
import org.gradle.api.initialization.dsl.*
import org.gradle.api.invocation.*
import org.gradle.api.java.archives.*
import org.gradle.api.logging.*
import org.gradle.api.logging.configuration.*
import org.gradle.api.model.*
import org.gradle.api.plugins.*
import org.gradle.api.plugins.announce.*
import org.gradle.api.plugins.antlr.*
import org.gradle.api.plugins.buildcomparison.gradle.*
import org.gradle.api.plugins.osgi.*
import org.gradle.api.plugins.quality.*
import org.gradle.api.plugins.scala.*
import org.gradle.api.provider.*
import org.gradle.api.publish.*
import org.gradle.api.publish.ivy.*
import org.gradle.api.publish.ivy.plugins.*
import org.gradle.api.publish.ivy.tasks.*
import org.gradle.api.publish.maven.*
import org.gradle.api.publish.maven.plugins.*
import org.gradle.api.publish.maven.tasks.*
import org.gradle.api.publish.plugins.*
import org.gradle.api.publish.tasks.*
import org.gradle.api.reflect.*
import org.gradle.api.reporting.*
import org.gradle.api.reporting.components.*
import org.gradle.api.reporting.dependencies.*
import org.gradle.api.reporting.dependents.*
import org.gradle.api.reporting.model.*
import org.gradle.api.reporting.plugins.*
import org.gradle.api.resources.*
import org.gradle.api.specs.*
import org.gradle.api.tasks.*
import org.gradle.api.tasks.ant.*
import org.gradle.api.tasks.application.*
import org.gradle.api.tasks.bundling.*
import org.gradle.api.tasks.compile.*
import org.gradle.api.tasks.diagnostics.*
import org.gradle.api.tasks.incremental.*
import org.gradle.api.tasks.javadoc.*
import org.gradle.api.tasks.scala.*
import org.gradle.api.tasks.testing.*
import org.gradle.api.tasks.testing.junit.*
import org.gradle.api.tasks.testing.testng.*
import org.gradle.api.tasks.util.*
import org.gradle.api.tasks.wrapper.*
import org.gradle.authentication.*
import org.gradle.authentication.aws.*
import org.gradle.authentication.http.*
import org.gradle.buildinit.plugins.*
import org.gradle.buildinit.tasks.*
import org.gradle.caching.*
import org.gradle.caching.configuration.*
import org.gradle.caching.http.*
import org.gradle.caching.local.*
import org.gradle.concurrent.*
import org.gradle.external.javadoc.*
import org.gradle.ide.visualstudio.*
import org.gradle.ide.visualstudio.plugins.*
import org.gradle.ide.visualstudio.tasks.*
import org.gradle.ide.xcode.*
import org.gradle.ide.xcode.plugins.*
import org.gradle.ide.xcode.tasks.*
import org.gradle.ivy.*
import org.gradle.jvm.*
import org.gradle.jvm.application.scripts.*
import org.gradle.jvm.application.tasks.*
import org.gradle.jvm.platform.*
import org.gradle.jvm.plugins.*
import org.gradle.jvm.tasks.*
import org.gradle.jvm.tasks.api.*
import org.gradle.jvm.test.*
import org.gradle.jvm.toolchain.*
import org.gradle.language.assembler.*
import org.gradle.language.assembler.plugins.*
import org.gradle.language.assembler.tasks.*
import org.gradle.language.base.*
import org.gradle.language.base.artifact.*
import org.gradle.language.base.compile.*
import org.gradle.language.base.plugins.*
import org.gradle.language.base.sources.*
import org.gradle.language.c.*
import org.gradle.language.c.plugins.*
import org.gradle.language.c.tasks.*
import org.gradle.language.coffeescript.*
import org.gradle.language.cpp.*
import org.gradle.language.cpp.plugins.*
import org.gradle.language.cpp.tasks.*
import org.gradle.language.java.*
import org.gradle.language.java.artifact.*
import org.gradle.language.java.plugins.*
import org.gradle.language.java.tasks.*
import org.gradle.language.javascript.*
import org.gradle.language.jvm.*
import org.gradle.language.jvm.plugins.*
import org.gradle.language.jvm.tasks.*
import org.gradle.language.nativeplatform.*
import org.gradle.language.nativeplatform.tasks.*
import org.gradle.language.objectivec.*
import org.gradle.language.objectivec.plugins.*
import org.gradle.language.objectivec.tasks.*
import org.gradle.language.objectivecpp.*
import org.gradle.language.objectivecpp.plugins.*
import org.gradle.language.objectivecpp.tasks.*
import org.gradle.language.rc.*
import org.gradle.language.rc.plugins.*
import org.gradle.language.rc.tasks.*
import org.gradle.language.routes.*
import org.gradle.language.scala.*
import org.gradle.language.scala.plugins.*
import org.gradle.language.scala.tasks.*
import org.gradle.language.scala.toolchain.*
import org.gradle.language.swift.*
import org.gradle.language.swift.plugins.*
import org.gradle.language.swift.tasks.*
import org.gradle.language.twirl.*
import org.gradle.maven.*
import org.gradle.model.*
import org.gradle.nativeplatform.*
import org.gradle.nativeplatform.platform.*
import org.gradle.nativeplatform.plugins.*
import org.gradle.nativeplatform.tasks.*
import org.gradle.nativeplatform.test.*
import org.gradle.nativeplatform.test.cpp.*
import org.gradle.nativeplatform.test.cpp.plugins.*
import org.gradle.nativeplatform.test.cunit.*
import org.gradle.nativeplatform.test.cunit.plugins.*
import org.gradle.nativeplatform.test.cunit.tasks.*
import org.gradle.nativeplatform.test.googletest.*
import org.gradle.nativeplatform.test.googletest.plugins.*
import org.gradle.nativeplatform.test.plugins.*
import org.gradle.nativeplatform.test.tasks.*
import org.gradle.nativeplatform.test.xctest.*
import org.gradle.nativeplatform.test.xctest.plugins.*
import org.gradle.nativeplatform.test.xctest.tasks.*
import org.gradle.nativeplatform.toolchain.*
import org.gradle.nativeplatform.toolchain.plugins.*
import org.gradle.normalization.*
import org.gradle.platform.base.*
import org.gradle.platform.base.binary.*
import org.gradle.platform.base.component.*
import org.gradle.platform.base.plugins.*
import org.gradle.play.*
import org.gradle.play.distribution.*
import org.gradle.play.platform.*
import org.gradle.play.plugins.*
import org.gradle.play.plugins.ide.*
import org.gradle.play.tasks.*
import org.gradle.play.toolchain.*
import org.gradle.plugin.devel.*
import org.gradle.plugin.devel.plugins.*
import org.gradle.plugin.devel.tasks.*
import org.gradle.plugin.management.*
import org.gradle.plugin.use.*
import org.gradle.plugins.ear.*
import org.gradle.plugins.ear.descriptor.*
import org.gradle.plugins.ide.api.*
import org.gradle.plugins.ide.eclipse.*
import org.gradle.plugins.ide.idea.*
import org.gradle.plugins.javascript.base.*
import org.gradle.plugins.javascript.coffeescript.*
import org.gradle.plugins.javascript.envjs.*
import org.gradle.plugins.javascript.envjs.browser.*
import org.gradle.plugins.javascript.envjs.http.*
import org.gradle.plugins.javascript.envjs.http.simple.*
import org.gradle.plugins.javascript.jshint.*
import org.gradle.plugins.javascript.rhino.*
import org.gradle.plugins.signing.*
import org.gradle.plugins.signing.signatory.*
import org.gradle.plugins.signing.signatory.pgp.*
import org.gradle.plugins.signing.type.*
import org.gradle.plugins.signing.type.pgp.*
import org.gradle.process.*
import org.gradle.testing.base.*
import org.gradle.testing.base.plugins.*
import org.gradle.testing.jacoco.plugins.*
import org.gradle.testing.jacoco.tasks.*
import org.gradle.testing.jacoco.tasks.rules.*
import org.gradle.testkit.runner.*
import org.gradle.vcs.*
import org.gradle.vcs.git.*
import org.gradle.workers.*
版权声明:本文为博主原创文章,未经博主允许不得转载。

android gradle自动构建大总结

android gradle自动构建背景:日常出版本和线上出版本时,需要手动修改一些配置,包括key配置、线上/测试环境配置、版本号增加等,过程繁琐。所以对构建脚本进行改进,达到自动构建目的。...
  • duantihi
  • duantihi
  • 2017年02月16日 13:25
  • 1586

Gradle:构建脚本概要

一、构建块 1.每个构建块都包含三个基本构建块:project、task和property; 2.每个构建块包含至少一个project,进而又包含一个或多个task; 3.project和tas...
  • p106786860
  • p106786860
  • 2016年01月05日 23:56
  • 2262

gradle学习笔记(三)从源码看构建流程之基本流程

一 gradle构建流程分为基本的三部:initlization,Configuration,Execution 1.初始化阶段 在这一阶段会解析加载init脚本和settings脚本,创建S...
  • yuanjw2014
  • yuanjw2014
  • 2016年11月16日 22:23
  • 234

学习写Gradle构建脚本(一)

文章内容来自Gradle官方的user-guide文档构建脚本的基本内容工程(projects)和任务(tasks)每一个构建脚本都是由一个或者多个工程组成。 一个工程由一个或多个任务组成。一个He...
  • xh_acmagic
  • xh_acmagic
  • 2017年11月16日 18:43
  • 27

大神所写的深度好文---Gradle 构建工具

我们大家都知道 Gradle 是一种构建工具,那么什么是构建工具呢?本文是关于Gradle的详解...
  • judy50
  • judy50
  • 2016年09月19日 17:07
  • 949

Gradle生命周期

Gradle生命周期Gradle构建系统有自己的生命周期,初始化、配置和运行三个阶段。1.初始化阶段,会去读取根工程中setting.gradle中的include信息,决定有哪几个工程加入构建, ...
  • u013626215
  • u013626215
  • 2016年05月24日 15:28
  • 2026

使用Gradle 快速构建项目

Installing Gradle Prerequisites Gradle requires a Java JDK or JRE to be installed, version...
  • boonya
  • boonya
  • 2016年01月21日 09:43
  • 1716

Gradle——构建脚本基础

1、项目(project)和任务(task)Gradle中的任何事都基于两个基本概念:项目(project)和任务(task)每一个构建(build)都是由一个或多个项目组成的。一个项目代表什么取决于...
  • u012325167
  • u012325167
  • 2015年10月19日 20:08
  • 302

(一)如何使用gradle构建Android项目

今天又是个放假的日子,放假对于很多人来说,可以到处去玩,可是对于那些单身程序猿来说,很难找到一个理由去哪里玩,...
  • u013970487
  • u013970487
  • 2014年03月22日 22:16
  • 2928

Gradle构建脚本基础

Gradle构建脚本,内部是基于 Groovy 的 DSL(领域特点语言),而Maven是基于XML的,Groovy相比XML更加简洁、灵活和强大。 Groovy 因为给 Java 开发人员提供了最大...
  • zxc123e
  • zxc123e
  • 2017年06月01日 13:54
  • 196
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Gradle学习(十三)——构建脚本详解
举报原因:
原因补充:

(最多只允许输入30个字)