这篇文章介绍了我们一直在研究的一些新的本地插件,它们可以构建Swift库和应用程序。它们可以在macOS和Linux上使用官方Swift编译器。
这些插件利用了Gradle核心中的许多功能,如丰富的依赖管理引擎以及源依赖、构建缓存、复合构建、更精细的并行执行、构建扫描等。 请注意,不幸的是,这些插件不能被用来构建iOS应用程序和库。
如果你想提供反馈,请与我们联系。
构建一个应用程序
你可以在Gradle本地样本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框架。
构建脚本应用了XCTest 插件,该插件将您的构建配置为在 macOS 上生成一个 XCTest 捆绑包或在 Linux 上生成一个 XCTest 可执行文件:
plugins {
id 'xctest'
}
下面是运行./gradlew check 的结果。Gradle在工具链安装中找到了XCTest模块,编译了Swift源代码和测试,然后运行测试:

Gradle对这个测试框架有很深的理解。它可以生成JUnit和HTML测试结果报告,也支持LinuxMain.swift 惯例来声明XCTest的Linux可执行入口。它还支持基本的测试过滤。以后会增加对XCTest的构建扫描支持、并行执行和改进过滤。
快速构建
插件可以使用Gradle新的变量感知依赖性管理产生应用程序或库的调试和发布构建,因此调试构建是针对调试库二进制文件进行编译和链接的,而发布构建是针对发布库二进制文件进行编译和链接的。当你构建调试构建时(这是默认的),Gradle只构建你需要的库的调试构建,而不是构建所有东西。
开发者和CI构建的速度很快。Swift编译是一个可缓存的任务,所以在使用构建缓存时,你可以避免不必要的、漫长的编译时间。Gradle Enterprise自带了一个构建缓存后台。你不需要使用--parallel 选项,因为Gradle默认进行增量和并行编译和链接。
让我们运行一些使用构建缓存的简介构建:

你可以看到第二个构建更快,因为结果是从构建缓存中获取的,而不是重新编译。构建扫描非缓存构建和缓存构建。
复合构建
复合构建的工作方式也与Java或C++项目相同。 这个使用复合构建的样本将构建结合在一起,因此它们可以一起工作:
rootProject.name = 'app'
includeBuild 'utilities-library'
includeBuild 'list-library'
这是Xcode中的结果。 应用程序和它使用的库可以一起编辑、构建和测试:
操作系统和源代码的兼容性
本地项目也可以为 Swift 组件配置操作系统(又称目标机)。
每个组件脚本块(如应用程序、库、xctest)都可以配置targetMachines 属性。配置的目标机将参与与构建主机兼容的机器的构建变体。 例如,下面指定应用程序只可在 Linux 机器上构建:
plugins {
id "swift-application"
}
application {
targetMachines = [machines.linux.x86_64]
}
在Linux机器上,将创建所有任务的变体。如下面的截屏所示, assemble 任务编译debug 变体,也被称为开发二进制:

另一个变体release 是可以通过linkReleaseX86-64 任务来编译的。
在其他操作系统上,Gradle不会构建任何东西,因为没有目标机器与构建主机兼容。值得注意的是,前面提到的任务都不会被创建,因为这些变体是不可构建的。 相反,调用assemble任务会简单地打印一条信息,如下面的截屏中所示:
源码依赖性
最近在介绍源码依赖性的博文中宣布了对源码依赖性的支持。
简而言之,源码依赖允许Gradle直接从源码中使用其他项目作为依赖。 对于Swift开发者来说,从源码中构建依赖是很常见的做法。 Gradle在构建消费者之前就已经处理了所有构建源码所需的线路。
如果源码依赖构建是Gradle构建,那么体验将类似于复合包含的构建。 另一方面,如果源码依赖是由其他构建系统构建的,Gradle可以注入配置代码来执行正确的构建命令并将工件映射到Gradle构建中。
文档
如果你熟悉本地样本库,你就有可能已经熟悉了演示Swift插件已经可以实现的样本。在Gradle 5.6中,我们发布了额外的文档,以帮助新用户加入Swift开发。我们建议阅读用户指南中的构建Swift项目和测试Swift项目章节来开始学习。
你也可以阅读Xcode插件参考章节,了解如何在你的Swift开发过程中使用Xcode IDE。
提供反馈
这些插件是一项正在进行的工作,有一些限制。例如,诸如可调试性等模型元素还不允许任何配置,您需要借助于使用编译器/链接器标记。
我们将继续改进这些插件,使其稳定,并最终支持iOS应用。
请尝试使用这些插件,并让我们知道你的想法。最简单的方法是克隆本地样本库并按照说明进行操作。我们的样本使用Gradle夜间构建,你可以在那里看到最新和最前沿的发展。
我们很想听听你认为哪些地方做得好,哪些地方让人困惑,哪些地方的不足会阻碍你使用Gradle来构建Swift软件。你也可以在Gradle论坛上留下反馈,或者在Gradle原生GitHub仓库上提出问题。