构建脚本所指就是build.gradle文件
Chapter 16. Writing Build Scripts 写脚本
Chapter 16. Writing Build Scripts 编写构建脚本
16.1. The Gradle build language
Gradle使用DSL语言描述脚本,该脚本基于Groovy,
很容易描述一个gradle
一个gradle包含Groovy的任何元素。Gradle默认脚本的编码为UTF-8
16.2. The Project API project api
我们早期说过,Gradle是通过构建脚本定义了一个项目
对于每一个项目,Gradle都创建了一个Project的对像将该项目和该对象关联起来
当脚本执行是,它配置该Project对象按照如下规则:
1,你调用的任何方法都没有在脚本中定义,则委托给Project对象。
2,你调用的任何属性都没有在脚本中定义,则委托给Project对象。
eg: 项目名称
println name
println project.name
结果:
D:\GradleTest>gradle -q check
name = javaLib
project.name = javaLib
name = project1
project.name = project1
D:\GradleTest>
16.2.1. Standard project properties project 标准属性
Name | Type | Default Value |
project | Project | The Project instance |
name | String | The name of the project directory. |
path | String | The absolute path of the project. |
description | String | A description for the project. |
projectDir | File | The directory containing the build script. |
buildDir | File |
|
group | Object | unspecified |
version | Object | unspecified |
ant | AntBuilder | An AntBuilder instance |
16.3. The Script API Script API
当Gradle执行一个脚本的时候,该脚本会被编译成一个Class,该类实现Script接口。
这就意味着,该脚本中有Script接口所声明的所有方法和属性。
16.4. Declaring variables 声明变量
有两种类型的变量可以在脚本中声明:局部变量和扩展属性
16.4.1. Local variables
通过def定义变量: eg: def dest = “dest”
but 执行任何任务都会打印dest,只要你println dest。
//def dest = "dest"
def dest = 3
task ss() {
println " dest = "+dest;
}
16.4.2. Extra properties
新建一个javalib,根目录创建build.gradle。 同时把该项目配置到settings.gradle(工程的根目录)
Gradle中的对象可以自定义自己的属性,包含但不限于projects,tasks和source sets中。
属性添加的2种方式:
1,添加单个属性
设置自定义属性:ext.自定义属性名
调用自定义属性: task.自定义属性名
2,添加多个属性
通过ext代码块(类似static代码块一样)
apply plugin: "java"
ext { // 多个属性
springVersion = "3.1.0.RELEASE"
emailNotification = "build@master.org"
}
// 单个属性
sourceSets.all { ext.purpose = null }
sourceSets {
main {
purpose = "production"
}
test {
purpose = "test"
}
plugin {
purpose = "production"
}
}
task printProperties << {
println springVersion
println emailNotification
sourceSets.matching { it.purpose == "production" }.each { println it.name }
}
结果;
D:\GradleTest>gradle -q printProperties
3.1.0.RELEASE
build@master.org
main
plugin
16.5. Configuring arbitrary objects 配置任意对象
配置任意已存在对象的的属性
格式:taskname(任意已存在对象){对象中的属性} // 有点生搬硬套了
task configure << {
def pos = configure(new java.text.FieldPosition(10)) {
//私有属性
beginIndex = 1
endIndex = 5
//public 方法
//setBeginIndex(2)
//setEndIndex(5)
}
println pos.beginIndex
println pos.endIndex
}
结果:
D:\GradleTest>gradle -q configure
1
5
16.6. Configuring arbitrary objects using an external script 通过外部的脚本(其他gradle文件)配置任意对象
build.gradle
task configure1 << {
def pos = new java.text.FieldPosition(10)
// Apply the script
apply from: 'other.gradle', to: pos
println pos.beginIndex
println pos.endIndex
}
other.gradle 外部的gradle文件(在同一根目录下)
// Set properties.
beginIndex = 3
endIndex = 5
结果:
D:\GradleTest>gradle -q configure1
3
5
16.7. Some Groovy basics 一些Groovy的基础知识
Gradle是基于Groovy语言的,所以了解Groovy语法对我们写插件和tasks是很有帮助的。
16.7.1. Groovy JDK
Groovy添加了很多标准的java类,也就是你可以用java的方法来写脚本
// Iterable gets an each() method
configurations.runtime.each { File f -> println f }
Have a look at http://groovy-lang.org/gdk.html for more details.
16.7.2. Property accessors 属性调用
属性调用通过.调用,相当于getter or setter方法
// Using a getter method
println project.buildDir
println getProject().getBuildDir()
// Using a setter method
project.buildDir = 'target'
getProject().setBuildDir('target')
16.7.3. Optional parentheses on method calls 圆括号()可选可不选
test.systemProperty ‘some.prop’, ‘value’
test.systemProperty(‘some.prop’, ‘value’)
16.7.4. List and map literals list和map迭代
// List literal
test.includes = ['org/gradle/api/**', 'org/gradle/internal/**']
List<String> list = new ArrayList<String>()
list.add('org/gradle/api/**')
list.add('org/gradle/internal/**')
test.includes = list
// Map literal.
Map<String, String> map = [key1:'value1', key2: 'value2']
// Groovy will coerce named arguments
// into a single map argument
apply plugin: 'java'
16.7.5. Closures as the last parameter in a method {}闭包作为方法的最后一个参数
闭包的语法及其他用法:here
repositories {
println "in a closure"
}
repositories() { println "in a closure" }
repositories({ println "in a closure" })
16.7.5.16.7.6. Closure delegate 关闭委托
dependencies {
assert delegate == project.dependencies
testCompile('junit:junit:4.12')
delegate.testCompile('junit:junit:4.12')
}
16.8. Default imports 默认导包
在每个脚本里面都有的包,导了包就可以只使用类名,否则需要完整的包名。
eg:new org.gradle.api.tasks.StopExecutionException() 可以直接写为 new StopExecutionException()
Listed below are the imports added to each script:
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.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.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.jetty.*
import org.gradle.api.plugins.osgi.*
import org.gradle.api.plugins.quality.*
import org.gradle.api.plugins.scala.*
import org.gradle.api.plugins.sonar.*
import org.gradle.api.plugins.sonar.model.*
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.reporting.*
import org.gradle.api.reporting.components.*
import org.gradle.api.reporting.dependencies.*
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.http.*
import org.gradle.buildinit.plugins.*
import org.gradle.buildinit.tasks.*
import org.gradle.external.javadoc.*
import org.gradle.ide.cdt.*
import org.gradle.ide.cdt.tasks.*
import org.gradle.ide.visualstudio.*
import org.gradle.ide.visualstudio.plugins.*
import org.gradle.ide.visualstudio.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.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.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.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.toolchain.*
import org.gradle.nativeplatform.toolchain.plugins.*
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.repository.*
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.javascript.rhino.worker.*
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.sonar.runner.*
import org.gradle.sonar.runner.plugins.*
import org.gradle.sonar.runner.tasks.*
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.testkit.runner.*
import org.gradle.util.*