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 测试结果报告,并支持用于声明 XCTest Linux 可执行文件入口点的 LinuxMain.swift 约定。它还支持基本测试过滤。对构建扫描、并行执行和 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 组件配置操作系统(即目标机器)。

每个组件脚本块(例如应用程序xctest)都可以配置 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 构建中。

文档 #

如果您熟悉原生示例仓库,那么您可能已经熟悉了演示 Swift 插件可以实现什么的示例。随着 Gradle 5.6 的发布,我们提供了额外的文档,以帮助新用户入门 Swift 开发。我们建议阅读用户指南的构建 Swift 项目测试 Swift 项目章节以开始。

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

提供反馈 #

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

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

请试用这些插件,并告诉我们您的想法。最简单的入门方法是克隆原生示例仓库并按照说明操作。我们的示例使用Gradle 夜间构建,因此您将在其中看到最新和最出色的开发成果。

我们很想听听您认为哪些方面做得好,哪些方面令人困惑,以及缺少哪些东西会阻碍您使用 Gradle 构建 Swift 软件。您也可以在Gradle 论坛上留下反馈,或在Gradle 原生 GitHub 仓库中提出问题。

讨论