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

时间:2022-12-26 18:24:37

转载请注明出处: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.*