Gradle Writing Build Scripts

2022-05-17 17:56:53 浏览数 (1)

The Gradle build language Gradle 构建语言

Gradle 提供了一种领域特定语言(DSL)来描述构建,这种构建语言在 Groovy 和 Kotlin 都可以使用。

Groovy 构建脚本可以包含任何 Groovy 语言元素。 Kotlin 构建脚本可以包含任何 Kotlin 语言元素。 Gradle 假设每个构建脚本都使用 UTF-8进行编码。

The Project API 电视宣传短片

实际上,构建脚本中的几乎所有顶级属性和块都是 Project api 的一部分。 为了演示,看看这个示例构建脚本,它输出项目的名称,该脚本通过 Project.name 属性访问:

代码语言:javascript复制
println name
println project.name
代码语言:javascript复制
> gradle -q check
projectApi
projectApi

两个 println 语句打印出相同的属性。 第一个方法使用顶层对 Project 对象的 name 属性的引用。 另一个语句使用任何生成脚本可用的项目属性,该脚本返回关联的 Project 对象。 只有当您定义的属性或方法与 Project 对象的成员具有相同的名称时,才需要使用 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

*projectDir*/build

group

Object

unspecified

version

Object

unspecified

ant

AntBuilder

An AntBuilder instance

这里描述的构建脚本针对 Project 对象。 还有分别针对 Settings 和 Gradle 对象的设置脚本和 init 脚本。

The script API 脚本 API

当 Gradle 执行 Groovy 构建脚本时(。 Gradle) ,它将脚本编译成一个实现 Script 的类。 这意味着脚本接口声明的所有属性和方法在脚本中都可用。

当 Gradle 执行 Kotlin 构建脚本时(。 Kts) ,它将脚本编译成 KotlinBuildScript 的子类。 这意味着 KotlinBuildScript 类型声明的所有可见属性和函数都可以在脚本中使用。 还可以分别查看用于设置脚本和 init 脚本的 KotlinSettingsScript 和 KotlinInitScript 类型。

Declaring variables 声明变量

可以在构建脚本中声明两种类型的变量: 局部变量和额外属性。

Local variables 局部变量

使用 def 关键字声明局部变量。 它们只能在声明它们的范围内可见。 局部变量是底层 Groovy 语言的一个特性。

代码语言:javascript复制
def dest = "dest"

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

Extra properties 额外属性

Gradle 域模型中的所有增强对象都可以包含额外的用户定义属性。 这包括但不限于项目、任务和源集。

可以通过所属对象的 ext 属性添加、读取和设置额外的属性。 或者,ext 块可以用来同时添加多个属性。

代码语言:javascript复制
plugins {
    id '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 {
    doLast {
        println springVersion
        println emailNotification
        sourceSets.matching { it.purpose == "production" }.each { println it.name }
    }
}
代码语言:javascript复制
> gradle -q printProperties
3.1.0.RELEASE
build@master.org
main
plugin

在此示例中,ext 块向项目对象添加两个额外的属性。 此外,通过将 ext.purpose 设置为 null (null 是允许的值) ,名为 purpose 的属性被添加到每个源集中。 一旦添加了属性,就可以像预定义的属性那样读取和设置它们。

通过要求添加属性的特殊语法,当尝试设置(预定义的或额外的)属性但该属性拼写错误或不存在时,Gradle 可能很快失败。 额外的属性可以从任何可以访问它们所属对象的地方访问,这使得它们的范围比局部变量更广。 从项目的子项目中可以看到项目的额外属性。

有关额外属性及其 API 的详细信息,请参阅 API 文档中的 ExtraPropertiesExtension 类。

Configuring arbitrary objects 配置任意对象

您可以用以下非常易读的方式配置任意对象。

代码语言:javascript复制
import java.text.FieldPosition

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

Configuring arbitrary objects using an external script 使用外部脚本配置任意对象

build.gradle

代码语言:javascript复制
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

代码语言:javascript复制
// Set properties.
beginIndex = 1
endIndex = 5

Some Groovy basics 一些 Groovy 的基础知识

Groovy 语言为创建 dsl 提供了大量特性,Gradle 构建语言利用了这些特性。 理解构建语言是如何工作的将有助于您编写构建脚本,特别是当您开始编写自定义插件和任务时。

Groovy JDK

Groovy 为标准 Java 类添加了许多有用的方法。 例如,Iterable 得到一个 each 方法,它遍历 Iterable 的元素:

代码语言:javascript复制
configurations.runtimeClasspath.each { File f -> println f }

Property accessors 属性访问器

Groovy 自动将属性引用转换为对适当的 getter 或 setter 方法的调用。

代码语言:javascript复制
// Using a getter method
println project.buildDir
println getProject().getBuildDir()

// Using a setter method
project.buildDir = 'target'
getProject().setBuildDir('target')

Optional parentheses on method calls 方法调用中可选的括号

代码语言:javascript复制
test.systemProperty 'some.prop', 'value'
test.systemProperty('some.prop', 'value')

List and map literals 列表和映射文字

Groovy 为定义 List 和 Map 实例提供了一些快捷方式。 这两种类型的文字都很简单,但是map literals有一些有趣的转折。

例如,“ apply”方法(通常用于应用插件)实际上需要一个 map 参数。 然而,当你有一行“ apply plugin: ‘ java’”时,你实际上并没有使用 map literal,而是使用了“ named parameters” ,它的语法和 map literal 几乎完全相同(没有包装括号)。 当方法被调用时,命名参数列表将被转换为映射,但它不是以映射开始的。

代码语言:javascript复制
// 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'

Closures as the last parameter in a method 闭包作为方法的最后一个参数

Gradle DSL 在许多地方使用闭包。 你可以在这里找到更多关于闭包的信息。 当方法的最后一个参数是闭包时,你可以在方法调用之后放置闭包:

代码语言:javascript复制
repositories {
    println "in a closure"
}
repositories() { println "in a closure" }
repositories({ println "in a closure" })

Closure delegate 结束代表

每个闭包都有一个委托对象,Groovy 使用这个对象查找变量和方法引用,这些变量和方法引用不是闭包的局部变量或参数。 Gradle 将此用于配置闭包,其中将 delegate 对象设置为要配置的对象。

代码语言:javascript复制
dependencies {
    assert delegate == project.dependencies
    testImplementation('junit:junit:4.12')
    delegate.testImplementation('junit:junit:4.12')
}

Default imports 默认导入

为了使构建脚本更简洁,Gradle 自动向 Gradle 脚本添加一组 import 语句。 这意味着不使用 throw new org.gradle.api.tasks。 Stopexecutionexception ()可以直接键入 throw new StopExecutionException ()。

下面列出了添加到每个脚本中的导入:

代码语言:javascript复制
import org.gradle.*
import org.gradle.api.*
import org.gradle.api.artifacts.*
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.artifacts.verification.*
import org.gradle.api.attributes.*
import org.gradle.api.attributes.java.*
import org.gradle.api.capabilities.*
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.execution.*
import org.gradle.api.file.*
import org.gradle.api.initialization.*
import org.gradle.api.initialization.definition.*
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.antlr.*
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.services.*
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.options.*
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.junitplatform.*
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.build.event.*
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.*
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.plugins.*
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.*
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.swiftpm.*
import org.gradle.swiftpm.plugins.*
import org.gradle.swiftpm.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.testing.jacoco.tasks.rules.*
import org.gradle.testkit.runner.*
import org.gradle.vcs.*
import org.gradle.vcs.git.*
import org.gradle.work.*
import org.gradle.workers.*

0 人点赞