你可以在支持 Gradle 的 IDE 中打开此示例。

本指南演示了如何使用 gradle init 通过 Gradle 创建 Swift 应用程序。你可以逐步按照指南从头开始创建一个新项目,或者使用上面的链接下载完整的示例项目。

你将构建什么

你将生成一个遵循 Gradle 约定的 Swift 应用程序。

你需要什么

创建项目文件夹

Gradle 自带一个名为 init 的内置 task,它在空文件夹中初始化一个新的 Gradle 项目。init task 使用(也是内置的)wrapper task 来创建一个 Gradle wrapper 脚本,gradlew

第一步是为新项目创建一个文件夹,并将目录更改到该文件夹中。

$ mkdir demo
$ cd demo

运行 init task

在新的项目目录中,使用终端中的以下命令运行 init task:gradle init。当提示时,选择 1: application 项目类型和 6: Swift 作为实现语言。接下来,你可以选择用于编写 buildscripts 的 DSL - 1 : Kotlin2: Groovy。对于其他问题,按 Enter 键使用默认值。

输出将如下所示

$ gradle init

Select type of build to generate:
  1: Application
  2: Library
  3: Gradle plugin
  4: Basic (build structure only)
Enter selection (default: Application) [1..4] 1

Select implementation language:
  1: Java
  2: Kotlin
  3: Groovy
  4: Scala
  5: C++
  6: Swift
Enter selection (default: Java) [1..6] 6

Project name (default: demo):

Select build script DSL:
  1: Kotlin
  2: Groovy
Enter selection (default: Kotlin) [1..2]

Generate build using new APIs and behavior (some features may change in the next minor release)? (default: no) [yes, no]

BUILD SUCCESSFUL
1 actionable task: 1 executed

init task 生成具有以下结构的新项目

├── gradle (1)
│   ├── libs.versions.toml (2)
│   └── wrapper
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradlew (3)
├── gradlew.bat (3)
├── settings.gradle.kts (4)
└── app
    ├── build.gradle.kts (5)
    └── src
        ├── main
        │   └── swift (6)
        │       └── main.swift
        └── test
            └── swift (7)
                └── GreeterTests.swift
                └── LinuxMain.swift
├── gradle (1)
│   ├── libs.versions.toml (2)
│   └── wrapper
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradlew (3)
├── gradlew.bat (3)
├── settings.gradle (4)
└── app
    ├── build.gradle (5)
    └── src
        ├── main
        │   └── swift (6)
        │       └── main.swift
        └── test
            └── swift (7)
                └── GreeterTests.swift
                └── LinuxMain.swift
1 为 wrapper 文件生成的文件夹
2 生成的版本目录
3 Gradle wrapper 启动脚本
4 Settings 文件,用于定义构建名称和子项目
5 app 项目的 Build 脚本
6 默认 Swift 源代码文件夹
7 默认 Swift 测试源代码文件夹

你现在已经设置好项目来构建 Swift 应用程序。

查看项目文件

settings.gradle(.kts) 文件有两行值得关注的代码

settings.gradle.kts
rootProject.name = "demo"
include("app")
settings.gradle
rootProject.name = 'demo'
include('app')
  • rootProject.name 为构建分配一个名称,这会覆盖默认行为,即以构建所在的目录命名构建。建议设置一个固定的名称,因为如果项目被共享(例如,作为 Git 仓库的根目录),文件夹可能会更改。

  • include("app") 定义构建由一个名为 app 的子项目组成,该子项目包含实际代码和构建逻辑。可以通过额外的 include(…​) 语句添加更多子项目。

我们的构建包含一个名为 app 的子项目,它代表我们正在构建的 Swift 应用程序。它在 app/build.gradle(.kts) 文件中配置

app/build.gradle.kts
plugins {
    `swift-application` (1)
    xctest (2)
}

application { (3)
    targetMachines.add(machines.linux.x86_64) (4)
}
app/build.gradle
plugins {
    id 'swift-application' (1)
    id 'xctest' (2)
}

application { (3)
    targetMachines.add(machines.linux.x86_64) (4)
}
1 应用 swift-application 插件以添加对构建 Swift 可执行文件的支持
2 应用 xctest 插件以添加对构建和运行 Swift 测试可执行文件(Linux)或 bundles(macOS)的支持
3 为此库设置目标操作系统和架构

文件 src/main/swift/main.swift 如下所示

生成的 src/main/swift/main.swift
/*
 * This source file was generated by the Gradle 'init' task
 */

class Greeter {
    public func greeting() -> String {
        return "Hello, World!"
    }
}

let greeter = Greeter()
print(greeter.greeting())

生成的测试,src/test/swift/main.swift 如下所示

生成的 src/test/swift/GreeterTests.swift
/*
 * This source file was generated by the Gradle 'init' task
 */

import XCTest
@testable import App

class GreeterTests: XCTestCase {
    public static let allTests = [
        ("testGreeting", testGreeting),
    ]

    func testGreeting() {
        XCTAssertEqual("Hello, World!", Greeter().greeting())
    }
}

生成的测试类有一个 XCTest 测试。该测试实例化 Greeter 类,在其上调用一个方法,并检查它是否返回预期值。

构建应用程序

$ ./gradlew build

BUILD SUCCESSFUL in 0s
7 actionable tasks: 7 executed
首次运行 wrapper 脚本 gradlew 时,可能会有延迟,因为该版本的 gradle 需要下载并本地存储在你的 ~/.gradle/wrapper/dists 文件夹中。

build task 编译 Swift 源代码,链接目标文件,并运行测试。它还打包主应用程序和测试应用程序,以便在其他系统上分发。installDebuginstallTest tasks(都作为 build 的一部分运行)复制可执行文件并生成一个 shell 脚本来执行应用程序。以下显示了 build/install 文件夹的内容

./app/build/install
├── main
│   └── debug
│       ├── app      (1)
│       └── lib
│           └── app  (2)
└── test
    ├── appTest      (1)
    └── lib
        └── appTest  (3)
1 用于执行应用程序变体的脚本
2 主可执行二进制文件(debug 变体)
3 测试可执行二进制文件
当构建具有依赖项时,依赖库也会被复制到安装文件夹中。shell 脚本会正确配置库路径,以便可以重新定位包。
本指南未涵盖对其他项目的依赖。要了解有关此主题的更多信息,请查看 transitive dependency sample 以进行演示。
Gradle 与多个 IDE 集成:Visual StudioXcodeClion。要了解更多信息,请查看它们各自链接的文档,以在你的项目中配置这些 IDE 集成。

运行应用程序

查看 build 文件夹内部,你会注意到出现了一个 exe 文件夹。按照约定,Gradle 会将所有应用程序放在根据组件名称命名的子文件夹中。在本例中,你将在 build/exe/main/debug 中找到你组装的可执行文件,它将被命名为 app(或 Windows 下的 app.exe)。

现在运行你新构建的可执行文件。

$ ./app/build/exe/main/debug/app
Hello, World!

发布 Build Scan

要了解更多关于你的构建在幕后做什么的最佳方法是发布一个 build scan。为此,只需使用 --scan 标志运行 Gradle。

$ ./gradlew build --scan

BUILD SUCCESSFUL in 0s
7 actionable tasks: 7 executed

Publishing a build scan to scans.gradle.com requires accepting the Gradle Terms of Service defined at https://gradle.com/terms-of-service.
Do you accept these terms? [yes, no] yes

Gradle Terms of Service accepted.

Publishing build scan...
https://gradle.com/s/5u4w3gxeurtd2

点击链接,探索执行了哪些 tasks,下载了哪些依赖项以及更多细节!

总结

就是这样!你现在已经成功地使用 Gradle 配置和构建了一个 Swift 应用程序项目。你已经学会了如何

  • 初始化一个生成 Swift 应用程序的项目

  • 构建、捆绑和运行应用程序

下一步

要了解更多关于如何进一步自定义 Swift 应用程序项目的信息,请查看用户手册中关于 构建 Swift 项目 的章节。