Gradle详解-Chapter 16. Writing Build Scripts

构建脚本所指就是build.gradle文件

Chapter 14 基础脚本构建

Chapter 16. Writing Build Scripts 写脚本

Chapter17. More about Tasks

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 标准属性

NameTypeDefault Value
projectProjectThe Project instance
nameStringThe name of the project directory.
pathStringThe absolute path of the project.
descriptionStringA description for the project.
projectDirFileThe directory containing the build script.
buildDirFileprojectDir/build
groupObjectunspecified
versionObjectunspecified
antAntBuilderAn 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.*
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值