Swift Library 插件提供了构建 Swift 库所需的任务和约定。特别是,Swift 库提供了可供使用者(即使用此插件或其他 Swift Application 插件 的项目)使用的功能。

用法

build.gradle.kts
plugins {
    `swift-library`
}
build.gradle
plugins {
    id 'swift-library'
}

构建变体

Swift Library 插件理解以下维度。请阅读构建变体介绍以获取更多信息。

构建类型 - 始终设置为 debugrelease

构建类型控制生成二进制文件的可调试性以及优化。

  • debug - 生成调试符号且不优化二进制文件

  • release - 生成调试符号并优化,但从二进制文件中提取调试符号

链接方式 - 默认为 shared

链接方式表示应该创建共享库还是静态库。库可以生成共享库、静态库或两者。

链接方式可按如下方式配置:

build.gradle.kts
library {
    linkage = listOf(Linkage.STATIC, Linkage.SHARED)
}
build.gradle
library {
    linkage = [Linkage.STATIC, Linkage.SHARED]
}
目标机器 - 默认为构建主机

目标机器表示应用程序期望运行的机器。目标机器由其操作系统和架构标识。Gradle 使用目标机器根据主机上的可用性来决定选择哪个工具链。

目标机器可按如下方式配置:

build.gradle.kts
library {
    targetMachines = listOf(machines.linux.x86_64, machines.macOS.x86_64)
}
build.gradle
library {
    targetMachines = [
        machines.linux.x86_64,
        machines.macOS.x86_64
    ]
}

任务

下图显示了此插件添加的任务之间的关系。

请注意,Swift 库的默认链接方式是共享链接,如图所示。

swift shared library task graph
图 1. Swift Library 插件默认任务图

使用静态链接时,图变为如下所示:

swift static library task graph
图 2. Swift Library 插件仅包含静态库的任务图

变体相关任务

Swift Library 插件根据库组件的变体创建任务。请阅读构建变体介绍以获取更多信息。下图显示了变体相关任务之间的关系。

swift library variant task graph
图 3. Swift Library 插件变体相关任务图
取决于链接属性
compileVariantSwift(例如 compileDebugSwiftcompileReleaseSwift)- SwiftCompile

依赖于:所有为编译贡献源文件的任务 :: 使用选定的编译器编译 Swift 源文件。

linkVariant(例如 linkDebuglinkRelease)- LinkSharedLibrary(共享链接)

依赖于:所有为链接库贡献的任务,包括通过项目依赖项解析的项目中的 linkVariantcreateVariant 任务 :: 使用选定的链接器从编译的对象文件链接共享库。

createVariant(例如 createDebugcreateRelease)- CreateStaticLibrary(静态链接)

使用选定的归档器从编译的对象文件创建静态库

assembleVariant(例如 assembleDebugassembleRelease)- 任务(生命周期)

依赖于:linkVariant(共享链接)或 createVariant(静态链接):: 聚合构建此库特定变体的任务。

生命周期任务

Swift Library 插件将其部分任务附加到Base Plugin 章中记录的标准生命周期任务——Swift Library 插件会自动应用此插件。

assemble - 任务(生命周期)

依赖于:当链接方式包含 shared 时依赖于 linkDebug,否则依赖于 createDebug。:: 聚合任务,用于在项目中为当前主机(如果存在)构建共享库的 debug 变体(如果可用)。此任务由 Base Plugin 添加。

check - 任务(生命周期)

聚合任务,用于执行验证任务,例如运行测试。一些插件将其自身的验证任务添加到 check 中。例如,XCTest 插件将其测试任务附加到此生命周期任务。此任务由 Base Plugin 添加。

build - 任务(生命周期)

依赖于:checkassemble :: 聚合任务,用于执行项目的完整构建。此任务由 Base Plugin 添加。

clean - 删除

删除构建目录及其中的所有内容,即由 layout.buildDirectory 项目属性指定的路径。此任务由 Base Plugin 添加。

依赖管理

与 Swift Library 插件创建的任务类似,会根据库组件的变体创建多个配置。请阅读构建变体介绍以获取更多信息。下图描述了 Swift Library 插件添加的配置。

swift library configurations
图 4. Swift Library 插件配置
  • 白色框中的配置是用户应该用于声明依赖项的配置

  • 粉色框中的配置(也称为可消费配置,标记为 (C))是组件编译、链接或运行时依赖于该库时使用的配置

  • 蓝色框中的配置(也称为可解析配置,标记为 (R))是组件内部用于自身用途的配置

以下配置用于声明依赖项:

api

用于声明 API 依赖项(参见 API 与 implementation 部分)。您应在此处声明那些通过传递性方式导出给使用者用于编译和链接的依赖项。

implementation 扩展自 api

用于声明主组件所有变体的 implementation 依赖项(参见 API 与 implementation 部分)。您应在此处声明那些纯粹是内部使用且不打算暴露给任何变体使用者的依赖项。

mainVariantImplementation(例如 mainDebugImplementationmainReleaseImplementation)扩展自 implementation

用于声明主组件特定变体的 implementation 依赖项(参见 API 与 implementation 部分)。您应在此处声明那些纯粹是内部使用且不打算暴露给此特定变体使用者的依赖项。

以下配置供使用者使用:

variantSwiftApiElements(例如 debugSwiftApiElementsreleaseSwiftApiElements)扩展自 mainVariantImplementation

用于针对该库进行编译。此配置旨在供使用者使用,以检索针对该库编译所需的所有元素。

variantLinkElements(例如 debugLinkElementsreleaseLinkElements)扩展自 mainVariantImplementation

用于针对该库进行链接。此配置旨在供使用者使用,以检索针对该库链接所需的所有元素。

variantRuntimeElements(例如 debugRuntimeElementsreleaseRuntimeElements)扩展自 mainVariantImplementation

用于执行该库。此配置旨在供使用者使用,以检索针对该库运行所需的所有元素。

以下配置供该库自身使用:

swiftCompileVariant(例如 swiftCompileDebugswiftCompileRelease)扩展自 mainVariantImplementation

用于编译该库。此配置包含该库的编译包含根目录,因此在调用 Swift 编译器编译它时使用。

nativeLinkVariant(例如 nativeLinkDebugnativeLinkRelease)扩展自 mainVariantImplementation

用于仅链接共享库。此配置包含该库的库文件,因此在调用 Swift 链接器链接它时使用。

nativeRuntimeVariant(例如 nativeRuntimeDebugnativeRuntimeRelease)扩展自 mainVariantImplementation

用于执行该库。此配置包含该库的运行时库文件。

API 与 implementation

此插件公开了两个可用于声明依赖项的配置:apiimplementationapi 配置应用于声明由库 API 导出的依赖项,而 implementation 配置应声明组件内部的依赖项。

示例 4. 添加依赖项
build.gradle.kts
library {
    dependencies {
        // FIXME: Put real deps here.
        api("io.qt:core:5.1")
        implementation("io.qt:network:5.1")
    }
}
build.gradle
library {
    dependencies {
        // FIXME: Write better deps here.
        api "io.qt:core:5.1"
        implementation "io.qt:network:5.1"
    }
}

出现在 api 配置中的依赖项将通过传递性方式暴露给该库的使用者,因此会出现在使用者的编译包含根目录和链接库中。另一方面,在 implementation 配置中找到的依赖项不会暴露给使用者,因此不会泄露到使用者的编译包含根目录和链接库中。这带来了几个好处:

  • 依赖项不会泄露到使用者的编译包含根目录和链接库中,因此使用者永远不会意外地依赖于传递性依赖项

  • 由于包含根目录和链接库减少,编译速度更快

  • 当 implementation 依赖项更改时,重新编译次数更少,因为使用者无需重新编译

约定

Swift Library 插件为源文件和任务添加了约定,如下所示。

项目布局

Swift Library 插件假定项目布局如下所示。这些目录无需存在或包含任何内容。Swift Library 插件将编译找到的任何内容,并忽略任何缺失的部分。

src/main/swift

扩展名为 .swift 的 Swift 源文件

您可以通过配置 library 脚本块上的 source配置项目布局

compileVariantSwift 任务

Swift Library 插件为要构建的库组件的每个变体添加一个 SwiftCompile 实例(例如 compileDebugSwiftcompileReleaseSwift)。请阅读构建变体介绍以获取更多信息。以下是一些最常见的配置选项:

compilerArgs(编译器参数)

[]

debuggable(可调试性)

true(真)

modules(模块)

configurations.swiftCompileVariant

macros(宏)

[]

objectFileDir(对象文件目录)

layout.buildDirectory.dir("obj/main/$variant")

optimized(优化)

debug 构建类型为 false,否则为 true

source(源文件)

library.swiftSource

targetPlatform(目标平台)

派生自二进制文件的 TargetMachine

toolChain(工具链)

根据目标机器自动选择

Swift Library 插件为包含 shared 链接方式作为维度的库的每个变体添加一个 LinkSharedLibrary 实例——例如 linkDebuglinkRelease。请阅读构建变体介绍以获取更多信息。以下是一些最常见的配置选项:

debuggable(可调试性)

true(真)

libs(库)

configurations.nativeLinkVariant

linkedFile(链接文件)

layout.buildDirectory.dir("lib/main/$variant/libModule[.so|dylib]")

linkerArgs(链接器参数)

[]

source(源文件)

compileVariantSwift.objects

targetPlatform(目标平台)

派生自二进制文件的 TargetMachine

toolChain(工具链)

根据目标机器自动选择

createVariant 任务

Swift Library 插件为包含 static 链接方式作为维度的库的每个变体添加一个 CreateStaticLibrary 实例——例如 createDebugcreateRelease。请阅读构建变体介绍以获取更多信息。以下是一些最常见的配置选项:

outputFile(输出文件)

layout.buildDirectory.dir("lib/main/$variant/libModule.a")

source(源文件)

compileVariantSwift.objects

staticLibArgs(静态库参数)

[]

targetPlatform(目标平台)

派生自二进制文件的 TargetMachine

toolChain(工具链)

根据目标机器自动选择