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.*