百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

Gradle学习记录004 学习build脚本

toyiye 2024-08-09 10:25 13 浏览 0 评论

学习Gradle的build脚本语言。该学习记录基于Gradle官方网站资料。本篇参考链接如下:

https://docs.gradle.org/current/userguide/writing_build_scripts.html

1.Gradle build脚本

Gradle提供了一种DSL(domain specific language)脚本语言来构建工程。这种脚本语言支持Groovy 和Kotlin两种写法。分别可以使用Groovy 和Kotlin语言的元素。

本学习记录使用的是Groovy编写方式。如果希望学习Kotlin,可以参照官网说明。

普遍意义上的build脚本就是最常用的*.gradle文件。

2.工程(project)API

构建脚本(*.gradle)通过配置来描述所要构建的工程。工程只是一个抽象的定义,可以认为它是一个java工程,一个lib包或者一个应用程序。每一个构建脚本都必须依赖一个工程对象。构建脚本的运行,就是对这个对象的配置。

下面的例子显示了在脚本中使用本工程的对象,及其属性。

这里的build.gradle脚本在projectA文件夹下,改文件夹被Gradle默认为工程。

task test {
	doLast {
	 // 输出任务名
		println(name)
 // 使用工程对象,输出项目名
		println(project.name)
	}
}

输出:

$ gradle -q test

test

projectA

※实际的输出结果和官网的结果不一样。官网相同的例子输出了两个工程名。但是在笔者环境里输出的是任务名和工程名。

几个常用的标准工程属性:

  • project:工程的对象。类型是Project
  • name:工程名,指向工程的根文件夹名。类型是String
  • path:工程的绝对路径。类型是String
  • description:工程的描述。类型是String
  • projectDir:含有构建脚本的工程路径。类型是File
  • buildDir:projectDir/build。类型是File
  • group:定义基本与maven工程的group相同。类型是Object
  • version:版本。类型是Object

3.脚本API

Gradle会把*.gradle脚本编译为实现了Script接口的类。所有Script接口定义的属性和方法都可以使用。

4.声明变量

  • 本地变量

本地变量用def修饰。只能用于当前脚本中。

 def outputString = "Local variable"
 task test {
 	doLast {
 	
 		println outputString
 	}
 }

输出:

$ gradle -q test

Local variable

  • 额外的属性

在Gradle里,可以自定义一些属性,用于扩充对象。比如扩充工程,任务对象等。

额外属性需要ext属性的支持。可以使用ext.myProperty或者如例子中使用ext代码块。

 plugins {
 id 'java'
 }
 
 // ext代码块,引入两个额外变量
 ext {
 springVersion = "3.1.0.RELEASE"
 emailNotification = "build@master.org"
 }

 // 为sourceSets的每一个source引入额外变量purpose,赋值为null
 sourceSets.all { ext.purpose = null }

 // 重新为每一个source的purpose变量赋值
 sourceSets {
 main {
 purpose = "production"
 }
 test {
 purpose = "test"
 }
 plugin {
 purpose = "production"
 }
 }

 // 输出
 task printProperties {
 doLast {
 println springVersion
 println emailNotification

 // 在set中找到purpose为producion的所有source,并打印source的名字
 sourceSets.matching { it.purpose == "production" }.each { println it.name }
 }
 }

输出:

$ gradle -q printProperties

3.1.0.RELEASE

build@master.org

main

plugin

关于plugin和sourceSets,后续会展开学习。

5.配置任意对象

  • 在当前脚本内部配置任意对象

如例所示,FieldPosition类有beginIndex和endIndex属性,通过configure方法,可以直接访问这两个属性,并且赋值。

 import java.text.FieldPosition
 task configure {
 doLast {
 def pos = configure(new FieldPosition(10)) {
 beginIndex = 1
 endIndex = 5
 }
 println pos.beginIndex
 println pos.endIndex
 }
 }

输出:

$ gradle -q configure

1

5

  • 通过引入外部脚本来配置任意对象

build.gradle

 task configure {
 doLast {
 def pos = new java.text.FieldPosition(10)
 // Apply the script
 apply from: 'other.gradle', to: pos
 println pos.beginIndex
 println pos.endIndex
 }
 }

other.gradle

 beginIndex = 1
 endIndex = 5

输出:

$ gradle -q configure

1

5

6.Groovy简介

使用Groovy方式编写脚本,需要了解一些Groovy的特性。

  • Groovy的JDK追加了一些java所没有的方法,比如Iterable追加了一个each方法。
		configurations.runtime.each { File f -> println f }
  • 简化访问属性的方法,可以直接访问属性,而不需要getter和setter。
  • 调用方法的时候,方法的参数可以不用括号
  • 简化List和Map的
 // List
 test.includes = ['org/gradle/api/**', 'org/gradle/internal/**']
 // Map
 Map<String, String> map = [key1:'value1', key2: 'value2']
  • 闭包可以作为方法的最后一个参数
 repositories {
 println "in a closure"
 }
 repositories() { println "in a closure" }
 repositories({ println "in a closure" })
  • 闭包代理(Closure delegate),每个闭包都可以使用代理来替代访问。Groovy主要用这个代理来访问闭包内的属性。※这里不太理解, 需要后续深入学习。
 dependencies {
 assert delegate == project.dependencies
 testCompile('junit:junit:4.12')
 delegate.testCompile('junit:junit:4.12')
 }

构建脚本默认引入的类库

构建脚本中,默认引入很多类库。所以可以在脚本中直接访问引入的类。具体列表可以参照如下链接。在后续的学习中,会学到一些具体类库的使用方法。

https://docs.gradle.org/current/userguide/writing_build_scripts.html#script-default-imports

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码