介绍 Swift 插件

这篇文章介绍了一些我们一直在开发的新原生插件,这些插件可以构建 Swift 库和应用程序。它们在 macOS 和 Linux 上都与 官方 Swift 编译器 一起使用。

这些插件利用了 Gradle 核心中的许多功能,例如丰富的依赖管理引擎以及 源依赖项构建缓存组合构建更细粒度的并行执行构建扫描 等等。需要注意的是,不幸的是,这些插件无法开箱即用地用于构建 iOS 应用程序和库。

如果您想提供反馈,请 与我们联系.

构建应用程序

您可以在 Gradle 原生示例 GitHub 存储库中找到本文中的所有示例。让我们看看如何构建一个 简单的应用程序.

构建脚本对于任何使用过 Gradle 的 Java 插件的人来说应该很熟悉

plugins {
    id 'swift-application'
}

此应用程序没有依赖项,Swift 源文件位于默认位置:src/main/swift 目录。由于这是 Gradle,您可以轻松地配置源位置以匹配您的项目所需的任何布局,包括 常见的 Swift 包管理器模式

以下是运行 ./gradlew assemble 在此示例上的结果

./gradlew assemble

查看此构建的构建扫描,以更详细地了解发生了什么。

compile debug timeline

插件会自动查找编译器、链接器和其他工具来构建应用程序。最终结果将安装在 build/install 目录中,准备运行。

IDE 支持

目前支持 Xcode 用于 Swift 项目。您只需运行 ./gradlew openXcode。Gradle 将生成工作区并在 Xcode 中打开生成的工作区。对其他 IDE 的支持将逐步添加。

以下是运行 ./gradlew openXcode 在示例上的结果

./gradlew xcode

这是工作区在 Xcode 中的外观

Xcode integration

依赖项

该插件使用 Gradle 的 依赖项管理 功能,就像其他插件(如 Java 或 Android 插件)一样。这意味着,例如,传递依赖项可以正常工作。

让我们向应用程序添加对库的依赖项。在 此示例 中,库及其依赖项在编译和链接应用程序之前构建。您无需在构建脚本中手动添加传递库。

以下是运行 ./gradlew build 在示例上的结果

./gradle build

查看此构建的构建扫描,以更详细地了解发生了什么。

transitive dependencies

以下是此项目在 Xcode 中的外观

Xcode integration

测试

XCTest 测试开箱即用。这是一个 使用 XCTest 的示例。它将在您的 Swift 工具链安装中找到 XCTest 框架。

构建脚本应用了 XCTest 插件,该插件配置您的构建以在 macOS 上生成 XCTest 包或在 Linux 上生成 XCTest 可执行文件

plugins {
    id 'xctest'
}

以下是运行 ./gradlew check 的结果。Gradle 在工具链安装中找到 XCTest 模块,编译 Swift 源代码和测试,然后运行测试。

./gradlew check

build scan for math check

Gradle 深入了解此测试框架。它可以 生成 JUnit 和 HTML 测试结果报告,并支持 LinuxMain.swift 约定来声明 XCTest Linux 可执行文件入口点。它还 支持基本的测试过滤。构建扫描支持、并行执行和改进的 XCTest 过滤将在稍后添加。

快速构建

这些插件可以使用 Gradle 的新变体感知依赖项管理来生成应用程序或库的调试和发布版本,以便调试版本编译并链接到调试库二进制文件,而发布版本编译并链接到发布库二进制文件。当您构建调试版本(默认版本)时,Gradle 仅构建您需要的库的调试版本,而不是构建所有内容。

开发和 CI 构建速度很快。Swift 编译是一个可缓存的任务,因此在使用 构建缓存 时,您可以避免不必要的长时间编译。 Gradle Enterprise 带有构建缓存后端。您不需要使用 --parallel 选项,因为 Gradle 默认情况下会进行增量和并行编译和链接。

让我们运行一些使用构建缓存的干净构建

./gradlew assemble with build cache

您可以看到第二次构建更快,因为结果是从构建缓存中获取的,而不是重新编译的。 非缓存构建缓存构建 的构建扫描。

cached vs non-cached assemble

复合构建

复合构建的工作方式与 Java 或 C++ 项目相同。这个 使用复合构建的示例 将构建组合在一起,以便可以一起处理它们。

rootProject.name = 'app'

includeBuild 'utilities-library'
includeBuild 'list-library'

以下是 Xcode 中的结果。应用程序及其使用的库可供一起编辑、构建和测试。

Xcode integration

操作系统和源代码兼容性

本机项目还可以为 Swift 组件配置操作系统(也称为目标机器)。

每个组件脚本块(例如 applicationlibraryxctest)都可以配置 targetMachines 属性。配置的目标机器将参与与构建主机兼容的机器的 构建变体。例如,以下内容指定应用程序仅在 Linux 机器上可构建。

plugins {
    id "swift-application"
}

application {
    targetMachines = [machines.linux.x86_64]
}

在 Linux 机器上,将创建所有任务的变体。如以下屏幕截图所示,assemble 任务编译 debug 变体,也称为开发二进制文件。

Building Swift Application on macOS

另一个变体 release 可以通过 linkReleaseX86-64 任务构建。

在其他操作系统上,Gradle 不会构建任何内容,因为没有目标机器与构建主机兼容。值得注意的是,之前提到的所有任务都不会被创建,因为变体不可构建。相反,调用 assemble 任务只会打印一条信息性消息,如以下屏幕截图所示。

Building Swift Application on Linux

源依赖项

对源依赖项的支持最近在 Introducing source dependencies 博客文章中宣布。

简而言之,源依赖项允许 Gradle 直接从源代码使用其他项目作为依赖项。对于 Swift 开发人员来说,从源代码构建依赖项是一种常见的做法。Gradle 会处理在构建消费者之前构建源代码所需的所有连接。

如果 源依赖项构建是 Gradle 构建,则体验将类似于复合 包含构建。另一方面,如果源依赖项由另一个构建系统构建,Gradle 可以注入配置代码以执行正确的构建命令并将工件映射到 Gradle 构建中。

文档

如果您熟悉 native samples 存储库,那么您可能已经熟悉演示了使用 Swift 插件可以实现什么的示例。在 Gradle 5.6 中,我们发布了额外的文档来帮助新用户开始使用 Swift 开发。我们建议阅读用户指南中的 Building Swift ProjectsTesting Swift Projects 章节以开始使用。

我们还引入了 每个 Swift 插件的参考章节。您还可以阅读 Xcode 插件参考章节,了解如何在 Swift 开发过程中使用 Xcode IDE。

提供反馈

这些插件仍在开发中,存在一些限制。例如,可调试性等模型元素目前不允许任何配置,您需要使用编译器/链接器标志。

我们将继续改进这些插件,使它们稳定,并最终支持 iOS 应用程序。

请尝试使用这些插件,并告诉我们您的想法。最简单的入门方法是克隆 native samples 存储库 并按照说明操作。我们的示例使用 Gradle nightly build,因此您将在那里看到最新和最棒的开发成果。

我们很乐意听到您对哪些功能有效、哪些功能令人困惑以及哪些功能缺失会阻碍您使用 Gradle 构建 Swift 软件的反馈。您也可以在 Gradle 论坛 上留下反馈,或在 Gradle native GitHub 存储库中提出问题。

讨论