Gradle - 构建脚本



Gradle 构建一个脚本文件来处理两件事;一个是项目,另一个是任务。每个 Gradle 构建都代表一个或多个项目。

一个项目代表一个库 JAR 或一个 web 应用程序,或者它可能代表一个从其他项目生成的 JAR 文件组装而成的 ZIP 文件。简单来说,一个项目是由不同的任务组成的。

任务意味着构建执行的一项工作。一项任务可能是编译一些类、创建 JAR、生成 Javadoc 或将一些存档发布到存储库。

Gradle 使用 Groovy 语言编写脚本。

编写构建脚本

Gradle 提供了一种领域特定语言 (DSL),用于描述构建。这使用 Groovy 语言来更容易地描述构建。Gradle 的每个构建脚本都使用 UTF-8 编码,离线保存并命名为 build.gradle。

build.gradle

我们使用 Groovy 脚本描述任务和项目。您可以使用 Gradle 命令运行 Gradle 构建。此命令查找名为build.gradle的文件。

让我们来看下面的例子,它代表一个打印tutorialspoint的小脚本。

将以下脚本复制并保存到名为build.gradle的文件中。此构建脚本定义了一个名为 hello 的任务,用于打印 tutorialspoint 字符串。

task hello {
  doLast {
   println 'tutorialspoint'
  }
}

在存储 build.gradle 文件的命令提示符中执行以下命令。

C:\> gradle –q hello

输出

您将看到以下输出:

tutorialspoint

如果您认为任务的工作方式类似于ANT 的目标,那么这是正确的。Gradle 任务相当于 ANT 目标。

您可以通过为doLast语句指定一个快捷方式(表示符号<<)来简化此 hello 任务。如果您将此快捷方式添加到上面的任务hello,它将看起来像下面的脚本:

task hello << {
   println 'tutorialspoint'
}

现在,您可以使用gradle –q hello命令执行上述脚本。

Grade 脚本主要使用两个实际对象,一个是 Project 对象,另一个是 Script 对象。

  • Project 对象 - 每个脚本都描述一个或多个项目。在执行过程中,此脚本配置 Project 对象。您可以在构建脚本中执行某些方法并使用属性,这些方法和属性委托给 Project 对象。

  • Script 对象 - Gradle 将脚本代码转换为实现 Script 接口的类,然后执行它。这意味着脚本接口声明的所有属性和方法都在您的脚本中可用。

下表定义了标准项目属性的列表。所有这些属性都在您的构建脚本中可用。

序号 名称 类型 默认值
1 project Project Project 实例
2 name String 项目目录的名称。
3 path String 项目的绝对路径。
4 description String 项目的描述。
5 projectDir File 包含构建脚本的目录。
6 buildDir File projectDir/build
7 group Object 未指定
8 version Object 未指定
9 ant AntBuilder AntBuilder 实例

Groovy 基础

Gradle 构建脚本使用完整的 Groovy API。

作为入门,让我们来看下面的例子。

示例 1

此示例说明如何将字符串转换为大写。

将下面给出的代码复制并保存到build.gradle文件中。

task upper << {
   String expString = 'TUTORIALS point'
   println "Original: " + expString
   println "Upper case: " + expString.toUpperCase()
}

在命令提示符中执行以下命令。它执行上面给出的脚本。您应该在存储 build.gradle 文件的位置执行此操作。

C:\> gradle –q upper

输出

Original: TUTORIALS point
Upper case: TUTORIALS POINT

示例 2

以下示例说明打印隐式参数 ($it) 的值 4 次

将以下代码复制并保存到build.gradle文件中。

task count << {
   4.times { 
    print "$it " 
   }
}

在命令提示符中执行以下命令。它执行上面提到的脚本。您应该在存储 build.gradle 文件的位置执行此操作。

$ gradle –q count

输出

这将产生以下输出:

0 1 2 3

Groovy 的特性

Groovy 语言提供了许多特性。下面讨论一些重要的特性:

Groovy JDK 方法

Groovy 向标准 Java 类添加了许多有用的方法。例如,JDK 中的 Iterable API 实现了一个each()方法,该方法迭代 Iterable 接口的元素。

将以下代码复制并保存到build.gradle文件中。

task groovyJDK << {
   String myName = "Marc";
   myName.each() { 
    println "${it}" 
   };
}

在命令提示符中执行以下命令。它执行上面给出的脚本。您应该在存储 build.gradle 文件的位置执行此操作。

C:\> gradle –q groovyJDK

输出

执行上述代码时,您应该看到以下输出:

M
a
r
c

属性访问器

您可以通过指定属性的引用来自动访问特定属性的适当 getter 和 setter 方法。

以下代码片段定义了属性buildDir的 getter 和 setter 方法的语法。

// Using a getter method
println project.buildDir
println getProject().getBuildDir()

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

方法调用中的可选括号

Groovy 在方法调用中包含一个特殊特性,即方法调用的括号是可选的。此特性也适用于 Gradle 脚本。

让我们来看下面的语法。它定义了test对象的systemProperty方法调用。

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

闭包作为最后一个参数

Gradle DSL 在许多地方使用闭包,其中方法的最后一个参数是一个闭包。您可以将闭包放在方法调用之后。

以下代码片段定义了闭包用作 repositories() 方法参数的语法。

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

默认导入

Gradle 会自动向 Gradle 脚本添加一组 import 语句。以下列表显示了 Gradle 脚本的默认导入包。

Gradle 脚本的默认导入包如下:

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.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.platform.base.test.*
import org.gradle.play.*
import org.gradle.play.distribution.*
import org.gradle.play.platform.*
import org.gradle.play.plugins.*
import org.gradle.play.tasks.*
import org.gradle.play.toolchain.*
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.jacoco.plugins.*
import org.gradle.testing.jacoco.tasks.*
import org.gradle.testkit.runner.*
import org.gradle.util.*
广告