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 的结果

./gradlew assemble

查看此构建的构建扫描以了解更详细的信息。

compile debug timeline

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

IDE 支持 #

目前 Swift 项目支持 Xcode。您只需运行 ./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 Framework。

构建脚本应用 XCTest 插件,该插件配置您的构建以在 macOS 上生成 XCTest bundle 或在 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 组件配置操作系统(也称为目标机器)。

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

plugins {
    id "swift-application"
}

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

在 Linux 机器上,将创建所有任务的变体。如下面的截屏视频所示,assemble 任务编译调试变体,也称为开发二进制文件。

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 Projects”“Testing Swift Projects”章节以开始使用。

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

提供反馈 #

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

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

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

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

讨论