Swift 插件介绍
简介
本文介绍了一些我们正在开发的新原生插件,这些插件可以构建 Swift 库和应用程序。它们可以在 macOS 和 Linux 上使用官方 Swift 编译器。
这些插件利用了 Gradle 核心中内置的许多特性,例如强大的依赖管理引擎以及源代码依赖、构建缓存、组合构建、更细粒度的并行执行、构建扫描等等。请注意,遗憾的是,这些插件不能直接用于构建 iOS 应用程序和库。
如果您想提供反馈,请与我们联系。
构建应用程序 #
您可以在 Gradle native samples GitHub 仓库中找到本文中的所有示例。让我们看看如何构建一个简单的应用程序。
构建脚本对于任何使用过 Gradle Java 插件的人来说都应该很熟悉
plugins {
id 'swift-application'
}
此应用程序没有依赖项,Swift 源代码文件位于默认位置:src/main/swift
目录。由于这是 Gradle,您可以轻松配置源位置以匹配您的项目所需的任何布局,包括常见的 Swift 包管理器模式。
这是在此示例上运行 ./gradlew assemble
的结果
查看此构建的构建扫描以了解更详细的信息。
插件会自动查找编译器、链接器和其他工具来构建应用程序。结果最终安装在 build/install
目录中,随时可以运行。
IDE 支持 #
目前 Swift 项目支持 Xcode。您只需运行 ./gradlew openXcode
。Gradle 将生成工作区并在 Xcode 中打开生成的工作区。对其他 IDE 的支持将逐步添加。
这是在此示例上运行 ./gradlew openXcode
的结果
这就是工作区在 Xcode 中的样子
依赖 #
该插件使用 Gradle 的依赖管理功能,就像 Java 或 Android 插件等其他插件一样。这意味着,例如,传递依赖可以正常工作。
让我们向应用程序添加对库的依赖。在此示例中,库及其依赖项在编译和链接应用程序之前构建。您不必在构建脚本中的任何位置手动添加传递库。
这是在此示例上运行 ./gradlew build
的结果
查看此构建的构建扫描以了解更详细的信息。
这是此项目在 Xcode 中的样子
测试 #
开箱即用支持 XCTest 测试。这是一个使用 XCTest 的示例。它将在您的 Swift 工具链安装中找到 XCTest Framework。
构建脚本应用 XCTest 插件,该插件配置您的构建以在 macOS 上生成 XCTest bundle 或在 Linux 上生成 XCTest 可执行文件
plugins {
id 'xctest'
}
这是运行 ./gradlew check
的结果。Gradle 在工具链安装中找到 XCTest 模块,编译 Swift 源代码和测试,然后运行测试
Gradle 对此测试框架有深入的了解。它可以生成 JUnit 和 HTML 测试结果报告,并支持用于声明 XCTest Linux 可执行文件入口点的 LinuxMain.swift
约定。它还支持基本的测试过滤。构建扫描支持、并行执行和改进的 XCTest 过滤将在稍后添加。
快速构建 #
这些插件可以使用 Gradle 新的变体感知依赖管理来生成应用程序或库的调试和发布版本,以便调试版本针对调试库二进制文件进行编译和链接,而发布版本针对发布库二进制文件进行编译和链接。当您构建调试版本(默认版本)时,Gradle 只构建您需要的库的调试版本,而不是构建所有内容。
开发人员和 CI 构建速度很快。Swift 编译是一项可缓存的任务,因此在使用构建缓存时,您可以避免不必要的长时间编译。Gradle Enterprise 附带构建缓存后端。您无需使用 --parallel
选项,因为 Gradle 默认情况下会执行增量和并行编译和链接。
让我们运行一些使用构建缓存的干净构建
您可以看到第二次构建速度更快,因为结果是从构建缓存中获取的,而不是重新编译的。非缓存构建和缓存构建的构建扫描。
组合构建 #
组合构建的工作方式也与 Java 或 C++ 项目相同。这个使用组合构建的示例将构建组合在一起,以便可以一起工作
rootProject.name = 'app'
includeBuild 'utilities-library'
includeBuild 'list-library'
这是在 Xcode 中的结果。应用程序及其使用的库可以一起编辑、构建和测试
操作系统和源代码兼容性 #
原生项目还可以为 Swift 组件配置操作系统(也称为目标机器)。
每个组件脚本块(例如 application、library、xctest)都可以配置 targetMachines
属性。配置的目标机器将参与与构建主机兼容的机器的构建变体。例如,以下指定应用程序仅可在 Linux 机器上构建。
plugins {
id "swift-application"
}
application {
targetMachines = [machines.linux.x86_64]
}
在 Linux 机器上,将创建所有任务的变体。如下面的截屏视频所示,assemble
任务编译调试变体,也称为开发二进制文件。
另一个变体 release
可以通过 linkReleaseX86-64
任务构建。
在其他操作系统上,由于没有目标机器与构建主机兼容,Gradle 将不会构建任何内容。值得注意的是,由于变体不可构建,因此不会创建之前提到的任何任务。相反,调用 assemble 任务将只打印一条信息性消息,如下面的截屏视频所示。
源代码依赖 #
最近在“Introducing source dependencies”博客文章中宣布了对源代码依赖的支持。
简而言之,源代码依赖允许 Gradle 直接从源代码中使用其他项目作为依赖项。Swift 开发人员通常从源代码构建依赖项。Gradle 负责在构建使用者之前构建源代码所需的所有连接。
如果源代码依赖构建是 Gradle 构建,则体验将类似于组合包含构建。另一方面,如果源代码依赖是由另一个构建系统构建的,则 Gradle 可以注入配置代码来执行正确的构建命令并将工件映射到 Gradle 构建中。
文档 #
如果您熟悉 native samples 仓库,那么您可能已经熟悉了展示 Swift 插件已实现的功能的示例。在 Gradle 5.6 中,我们发布了额外的文档,以帮助新用户开始使用 Swift 开发。我们建议阅读用户指南的“Building Swift Projects”和“Testing Swift Projects”章节以开始使用。
我们还为每个 Swift 插件引入了参考章节。您还可以阅读 Xcode 插件参考章节,了解如何在 Swift 开发期间使用 Xcode IDE。
提供反馈 #
这些插件仍在开发中,并且有一些限制。例如,调试能力等模型元素尚不允许任何配置,您需要求助于使用编译器/链接器标志。
我们将继续改进这些插件,使其稳定,并最终支持 iOS 应用程序。
请尝试使用这些插件,并告诉我们您的想法。最简单的入门方法是克隆 native samples 仓库并按照说明进行操作。我们的示例使用 Gradle nightly build,因此您将看到最新的开发成果。
我们很想听听您认为哪些方面做得好,哪些方面令人困惑,以及缺少哪些功能会阻止您使用 Gradle 构建 Swift 软件。您还可以在 Gradle 论坛上留下反馈,或在 Gradle native GitHub 仓库上提出问题。