翻译:Gradle之构建脚本编写

小编 2026-06-08 阅读:1505 评论:0
原文地址 http://www.gradle.org/docs/current/user...

原文地址 http://www.gradle.org/docs/current/userguide/writing_build_scripts.html

13.1. The Gradle build language构建语言

Gradle提供了一种“领域专用语言”(domain specific language) 或者 DSL对构建进行描述。这种语言基于Groovy,并加入了其他特性使得描述更简单。

13.2. The Project API

在第七章Chapter 7, Java Quickstart 我们以apply() 方法为例做了描述。咦,这个方法哪来的?当时我们说脚本定义了工程,对于每一个工程Gradle会创建一个 Project 型的实例并将该对象实例和构建脚本进行关联。当构建脚本执行时会配置这个对象:

Getting help writing build scripts

嗨嗨别忘了构建脚本是Groovy代码,用的是Gradle API。而Project 接口就是你最先要了解的访问Gradle API的工具。所以要了解什么标签可用,就得去看Project 接口的文档.

  • 脚本中调用的任何方法如果在基本中无定义,都委托给Project对象。

  • 属性的访问同上。

咱们试着访问name属性看看 。

Example 13.1. Accessing property of the Project object

build.gradle

println nameprintln project.name

Output of gradle -q check

> gradle -q checkprojectApiprojectApi

哇唔,俩println 语句都打出了同一个属性。前者是自动委托了Project对象,对于没在脚本里定义的属性施行。后者使用了工程命来关联Project对象。 如果你定义的属性和Project的成员一样了,那就必须使用工程名进行界定了。

13.2.1. Standard project properties标准属性

Project对象提供了几个标准属性,下面列出了一些常用的:

Table 13.1. Project Properties

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

13.3. The Script API

脚本执行的时候Gradle会把它编译进实现了 Script接口的一个类中,这样接口中的属性和方法都能直接使用了。

13.4. Declaring variables声明变量

可是声明两种变量:局部变量和额外属性。

13.4.1. Local variables局部变量

使用 def 关键字声明局部变量,它们只能在声明域中访问。局部变量在Groovy中就有。

Example 13.2. Using local variables

build.gradle

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

13.4.2. Extra properties额外属性

Gradle域模型中的增强对象都有额外的用户定义属性。这包括但不限于工程、任务、资源集等。通过ext属性可以增加、读取、改变额外属性。也可以使用ext块增加多个额外属性。

Example 13.3. Using extra properties

build.gradle

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 }}

Output of gradle -q printProperties

> gradle -q printProperties3.1.0.RELEASEbuild@master.orgmainplugin

上例中用 ext 块增加了两个额外属性。另外通过设置ext.purpose为null为每个资源集增加了purpose属性。一旦属性被增加就可以像预定义属性一样访问。

通过要求严格语法,Gradle会在尝试访问不存在是属性命时立即失败。额外属性可以从任何域访问,父工程的额外属性也能被子工程访问。

更多关于额外属性访问: ExtraPropertiesExtension.

13.5. Some Groovy basics 基本Groovy入门

Groovy提供了大量特性来创建DSL,Gradle就利用了这一点。

13.5.1. Groovy JDK

Groovy给JVM类增加了大量好用的方法。比如 Iterable 有一个 each 方法,可以迭代访问元素:

Example 13.4. Groovy JDK methods

build.gradle

// Iterable gets an each() methodconfigurations.runtime.each { File f -> println f }

详细请看 http://groovy.codehaus.org/groovy-jdk/ 

13.5.2. Property accessors属性访问符

Groovy会自动给属性增加 getter或 setter 方法.

Example 13.5. Property accessors

build.gradle

// Using a getter methodprintln project.buildDirprintln getProject().getBuildDir()// Using a setter methodproject.buildDir = 'target'getProject().setBuildDir('target')

13.5.3. Optional parentheses on method calls括号可有可无

方法的括号在调用时不需要写

Example 13.6. Method call without parentheses

build.gradle

test.systemProperty 'some.prop', 'value'test.systemProperty('some.prop', 'value')

13.5.4. List and map literals迭代

Groovy提供了定义 List 和Map的快捷方法:

Example 13.7. List and map literals

build.gradle

// List literaltest.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 literalapply plugin: 'java'Map<String, String> map = new HashMap<String, String>()map.put('plugin', 'java')apply(map)

13.5.5. Closures as the last parameter in a method闭包作末参数

Gradle DSL随处使用闭包,闭包的概念见here。如果方法的最后一个参数是闭包,则可以把闭包后置 :

Example 13.8. Closure as method parameter

build.gradle

repositories {    println "in a closure"}repositories() { println "in a closure" }repositories({ println "in a closure" })

13.5.6. Closure delegate闭包委托

每个闭包都有一个delegate 对象,Groovy使用它来查找闭包的非局部变量和引用。Gradle以此来配置闭包,给闭包添加delegate对象。

Example 13.9. Closure delegates

build.gradle

dependencies {    assert delegate == project.dependencies    compile('junit:junit:4.11')    delegate.compile('junit:junit:4.11')}

 

 

版权声明

本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。

热门文章
  • 机房智能化温湿度解决方式之POE供电以太网温湿度传感器

    机房智能化温湿度解决方式之POE供电以太网温湿度传感器
    机房智能化温湿度解决方式之POE供电以太网温湿度传感器 北京盈创力和电子科技有限公司 智能型TCP网口温湿度记录仪 北京IP网络温湿度记录仪厂家,北京盈创力和 北京智能型TCP网口温湿度记录仪IP网络温湿度记录仪是一种新型的基于TCP/IP协议双绞线以太网标准温湿度采集模块,利用它可以实现现场温度值、相对湿度值的采集,同时利用其自身的RJ45通信接口可以方便地和机房监控主机或交换机集线器进行联网。 工作于-40℃~85℃工业级带...
  • Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering

    Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering
    Problem Statement 我们考虑一个具有马尔可夫性质、非线性、非高斯的状态空间模型(State Space Model):对于一个时间序列上的观测结果{yt,t∈N}\\{ y_t , t \\in N \\}{yt​,t∈N},我们认为每个观测结果yty_tyt​的生成依赖于一个无法直接观察的隐变量xt∈{xt,t∈N}x_t \\in \\{x_t , t \\in N \\}xt​∈{xt​,t∈N},即:p(...
  • HTTP状态保持的原理

    HTTP状态保持的原理
    a)在用户登录之后,浏览器返回响应的时候会在响应中添加上cookieb)浏览器接收到cookie之后会自动保存c)当用户再次请求同一服务器中的其他网页的时候,浏览器会自动带上之前保存的cookied)服务接收到请求之后可以请 request 对象中取到cookie 判断当前用户是否登录  Http是无状态的,就是连接时数据互通,关闭后...
  • Hive 系统函数及示例

    Hive 系统函数及示例
    查看所有系统函数 show functions; 函数分类 内置函数【系统函数】 数学函数: floor、round、ceil、cos、log2等 字符串函数: length、reverse、trim、lower、get_json_object、repeat等 收集函数: size 转换函数: cast 日期函数: year、month、datediff、date、date_add等 条件函数: coalesce、case…w...
  • CSRF的原理和防范措施

    CSRF的原理和防范措施
    a)攻击原理:i.用户C访问正常网站A时进行登录,浏览器保存A的cookieii.用户C再访问攻击网站B,网站B上有某个隐藏的链接或者图片标签会自动请求网站A的URL地址,例如表单提交,传指定的参数iii.而攻击网站B在访问网站A的时候,浏览器会自动带上网站A的cookieiv.所以网站A在接收到请求之后可判断当前用户是登录状态,所以...
标签列表