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

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

转载请注明出处:/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.*
版权声明:本文为博主原创文章,未经博主允许不得转载。

Gradle 15分钟入门教程

1-Gradle入门介绍 在阅读或实践本文中的实例前,必须首先确保已将Gradle插件安装到Eclipse中。如果没有,可以点击下面的链接查看Gradle安装说明:  - http://www...
  • qitongce
  • qitongce
  • 2017年05月18日 14:09
  • 2413

Gradle脚本基础全攻略

【工匠若水 /yanbober 转载请注明出处。点我开始钱柜娱乐开户技术交流】1 背景在开始Gradle之前请务必保证自己已经初步了解了Groovy脚本,特别...
  • yanbober
  • yanbober
  • 2015年10月25日 23:19
  • 74395

Gradle:构建脚本概要

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

Gradle学习(十一)——构建脚本基础知识

Gradle的所有都是基于两个基础概念:项目和任务每个Gradle构建是由一个或者多个项目构成的,项目表示什么取决于你用Gradle做什么。比如,项目可以表示jar库或者web程序。它也可以表示由其他...
  • lastsweetop
  • lastsweetop
  • 2018年01月03日 16:26
  • 678

Gradle——构建脚本基础

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

Gradle 1.12 翻译——第十三章 编写构建脚本

第十三章 编写构建脚本 这一章着眼于一些编写构建脚本的详细信息。 13.1. Gradle 构建语言 Gradle 提供一种领域特定语言或者说是 DSL,来描述构建。这种构建语言基于 Groovy ...
  • maosidiaoxian
  • maosidiaoxian
  • 2014年11月10日 09:17
  • 3593

gradle学习(11)-编写构建脚本

1.DSL 领域专业语言
  • qhshiniba
  • qhshiniba
  • 2015年01月10日 12:17
  • 2146

shell十三问——学习shell编程的好书

  • 2011年05月06日 22:23
  • 318KB
  • 下载

博客<Animation动画详解(十三)——实现ListView Item进入动画>对应源码

  • 2016年03月28日 08:19
  • 8.94MB
  • 下载

Inno Setup入门(十三)——Pascal脚本(2)

事件函数(2)function CheckPassword(Password: String): Boolean;如果安装程序在Pascal 脚本中发现该函数,它自动显示密码页并调用CheckPass...
  • Augusdi
  • Augusdi
  • 2013年02月02日 11:26
  • 1767
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Gradle学习(十三)——构建脚本详解
举报原因:
原因补充:

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