读书笔记《gradle-effective-implementations-guide-second-edition》混合语言
我们已经了解了如何将 Gradle 用于带有 Java 代码的项目。 Gradle 也支持其他语言。在过去的几年里,出现了其他用于 JVM 的语言。在本章中,我们将了解 Gradle 对 Groovy 和 Scala 语言的支持。 JVM 支持这两种语言。
我们将看到如何将正确的插件和配置应用到我们的 Gradle 构建文件以使用不同的语言。
Gradle 也支持 C。C 插件增加了对编译源文件的支持。 JavaScript 和 Closure 插件作为第三方插件提供,增加了对这些语言的支持。我们不会在本书中介绍这种支持。我们将专注于 JVM 语言——Groovy 和 Scala。
要在我们的项目中使用 Groovy 源,我们可以应用 Groovy 插件。 Groovy 插件可以将 Groovy 源文件编译为类文件。该项目可以包含 Java 和 Groovy 源文件。 Gradle 使用的编译器是一个联合编译器,可以编译 Java 和 Groovy 源文件。
该插件还为我们的构建添加了新任务。要编译 Groovy 源文件,我们可以调用 compileGroovy
任务。可以使用 compileTestGroovy
任务编译用 Groovy 编写的测试源。此外,为我们的构建定义中的每个额外源集添加了一个 compile<SourceSet>Groovy
任务。因此,如果我们创建一个名为 api
的新源集,就会有一个 compileApiGroovy
任务。
在以下示例构建文件中,我们应用了 Groovy 插件:
如果我们调用 tasks
任务来查看可用的内容,我们会得到以下输出:
请注意,我们还从 Java 插件中获得了所有任务。这是因为 Groovy 插件自动包含 Java 插件。因此,即使我们只在构建文件中定义了 Groovy 插件,Java 插件也会被应用。
额外的 compileGroovy
和 compileTestGroovy
任务在命令输出中可见。新任务是 classes
和 testClasses
任务的依赖任务。如果我们调用 classes
任务,则 compileGroovy
任务也会被执行。
该插件添加了 groovy 配置。 Groovy 编译器使用此配置。因此,要在我们的项目中编译 Groovy 源文件,我们必须设置对 compile
配置的依赖。
要编译 Groovy 源文件,我们必须将要使用的 Groovy 库的依赖项添加到 compile
配置中。我们可能期望 Gradle 将使用 Gradle 使用的 Groovy 版本,但编译任务独立于 Gradle 使用的 Groovy 版本。我们必须自己定义 Groovy 库。
独立于 Gradle 附带的 Groovy 库是很好的,因为这样我们就可以使用我们真正需要的 Groovy 版本。当我们想使用 Gradle 附带的 Groovy 库时,我们可以使用 localGroovy()
特殊依赖项。对于普通的 Groovy 项目,不建议这样做;但对于插件开发,它很有用。
首先,我们创建一个 Groovy 源文件,以便我们可以使用 Gradle 编译它。 Groovy 源文件的默认源目录是 src/main/groovy
。让我们在 src/main/groovy/gradle/sample
目录下新建一个文件,名称为 Sample.groovy
.以下代码显示了该文件的内容:
接下来,我们创建一个 Gradle 构建文件并应用 Groovy 插件。我们将 Bintray JCenter 存储库和 Groovy 依赖项添加到 compile
配置中,如下所示:
当我们运行 build
任务时,我们得到以下输出:
当我们的缓存中没有指定的 Groovy 库时,Gradle 从 Bintray JCenter 存储库下载它。源代码文件编译完成,查看build/classes
目录可以看到编译后的class文件。
Groovy 插件还添加了新的源集属性。下表显示了额外的属性:
属性名称 |
类型 |
说明 |
|
|
这些是该项目的 Groovy 源文件。这包含 |
|
|
这些是带有 Groovy 源文件的目录。它们还可以包含用于联合编译的 Java 源文件。 |
|
|
这些仅包含 Groovy 源文件。所有带有 |
我们扩展了之前的构建文件并添加了 groovySourceSetsProperties
任务。我们使用此任务打印额外的属性及其值。构建现在看起来类似于以下代码:
当我们在命令行上运行 groovySourceSetProperties
任务时,我们会看到以下输出:
当我们的 Java 代码使用 Groovy 类时,反之亦然,我们可以使用联合编译功能。我们必须确保 Java 和 Groovy 源文件都在 src/main/groovy
目录中。
Groovy 插件还添加了 groovydoc
任务。 groovydoc
任务类似于 Java 插件中的 javadoc
任务。 Gradle 使用 GroovyDoc
工具,该工具可从我们定义为 compile
配置的依赖项的 Groovy 版本中获得.
该任务有几个我们可以更改的属性。例如,我们可以设置要在生成的文档中使用的页眉和页脚。
在以下构建文件中,我们将配置 groovydoc
任务:
当我们运行 groovydoc
任务时,我们可以在 build/docs/groovydoc
目录中看到生成的文档。我们必须在 Web 浏览器中打开 index.html
文件才能看到结果。
我们还可以使用 Gradle 来处理 Scala 源文件。我们可以在我们的项目中有一个纯 Scala 项目或 Java 和 Scala 源文件。我们必须应用 Scala 插件来为我们的构建启用 Scala 支持。该插件添加了新任务来编译 Scala 源文件。通过 compileScala
任务,我们编译我们的主要 Scala 源文件。源文件必须在 src/main/scala
目录中。 compileTestScala
任务编译 src/test/scala
目录中的所有 Scala 源代码文件。该插件还为我们的构建中的自定义源集添加了一个 compile<SourceSet>Scala
任务。
编译任务通过联合编译支持 Java 和 Scala 源文件。我们可以将 Java 源文件放在项目的 src/main/java
目录中,将 Scala 源文件放在 src /main/scala
目录。编译器将编译这两种类型的文件。为了能够编译这些文件,我们必须在我们的构建文件中添加对 Scala 库的依赖。我们必须将来自 Maven 存储库的正确依赖项分配给 compile
配置,以便 Gradle 可以调用编译器来编译源文件。
我们在 src/main/scala/gradle/
目录下创建一个简单的 Scala 源文件 sample 并保存为 Sample.scala
:
在以下示例构建文件中,我们应用了 Scala 插件。此外,在 dependencies
部分中,我们为编译器设置了正确的依赖项,如下所示:
为了构建项目,我们调用 build
任务并获得以下输出:
注意 compileScala
和 compileTestScala
任务是 类 和
testClasses
任务。因此,新添加的任务自动成为我们从 Java 项目中知道的正常构建任务的一部分。如果我们自己不应用 Java 插件,Scala 插件会自动包含 Java 插件。
我们可以在我们的项目中定义一个自定义源集。 Scala 插件为我们项目的每个源集添加了一个 compile
任务。在下面的 Gradle 构建文件中,我们添加了一个名为 actors
的新源集,如下所示:
当我们调用 tasks
命令时,我们看到 Gradle 将 compileActorsScala
添加到了可用任务列表中:
actorsClasses
任务已添加,并具有 actors
源集的所有编译任务。当我们希望 actorsClasses
任务成为构建任务的一部分时,我们可以将其作为任务依赖项分配给jar
任务。在下面的示例构建文件中,我们使用 jar
任务的 from()
方法来分配 的输出;actors
源集作为 JAR 文件内容的一部分。
当我们执行 build
任务时,我们在 actors
源集中的源文件被编译并添加到 JAR 文件中。
Scala 插件还向源集添加了几个新属性。下表显示了额外的属性:
属性名称 |
类型 |
说明 |
|
|
这是这个项目的 Scala 源文件;它包含 |
|
|
这些是 Scala 源文件的目录;它们还可以包含用于联合编译的 Java 源文件。 |
|
|
这些只是 Scala 源文件。所有带有 |
让我们创建一个新任务 scalaSourceSetsProperties
,来查看每个属性的内容:
当我们从命令行调用 scalaSourceSetsProperties
任务时,我们得到以下输出: