Swift 库插件与 配置缓存 不兼容。

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

用法

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

构建变体

Swift 库插件理解以下维度。阅读 构建变体简介 以了解更多信息。

构建类型 - 始终设置为 debugrelease

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

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

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

链接 - 默认值为共享

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

链接可以按如下方式配置

示例 2. 配置库链接
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 库插件默认任务图

使用静态链接,图将变为以下内容

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

变体相关的任务

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

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

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

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

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

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

使用选定的存档器从已编译的目标文件创建静态库

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

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

生命周期任务

Swift 库插件将其某些任务附加到基本插件章节中记录的标准生命周期任务 - Swift 库插件会自动应用这些任务

assemble - 任务(生命周期)

取决于:当链接包含 sharedcreateDebug 时为 linkDebug,否则为 linkDebug。:: 聚合任务,用于为项目中的当前主机(如果存在)组装共享库的调试变体(如果可用)。此任务由 基础插件 添加。

check - 任务(生命周期)

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

build - 任务(生命周期)

取决于:checkassemble :: 聚合任务,用于执行项目的完整构建。此任务由 基础插件 添加。

clean - 删除

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

依赖管理

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

swift library configurations
图 4. Swift 库插件配置
  • 白色配置是用户应用来声明依赖项的配置

  • 粉色配置,也称为可消费配置,用 (C) 表示,是在组件编译、链接或针对库运行时使用的配置

  • 蓝色配置,也称为可解析配置,用 (R) 表示,是组件内部使用的配置

以下配置用于声明依赖项

api

用于声明 API 依赖项(参见 API 与实现部分)。这是您应该声明依赖项的地方,这些依赖项将被传递给消费者,用于编译和链接。

implementation 扩展 api

用于声明主组件所有变体的实现依赖项(参见 API 与实现部分)。您应该在此处声明纯粹的内部依赖项,这些依赖项不应暴露给任何变体的使用者。

mainVariantImplementation(例如 mainDebugImplementationmainReleaseImplementation)扩展 implementation

用于声明主组件特定变体的实现依赖项(参见 API 与实现部分)。您应该在此处声明纯粹的内部依赖项,这些依赖项不应暴露给此特定变体的使用者。

以下配置由使用者使用

variantSwiftApiElements(例如 debugSwiftApiElementsreleaseSwiftApiElements)扩展 mainVariantImplementation

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

variantLinkElements(例如 debugLinkElementsreleaseLinkElements)扩展 mainVariantImplementation

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

variantRuntimeElements(例如 debugRuntimeElementsreleaseRuntimeElements)扩展 mainVariantImplementation

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

以下配置由库本身使用

swiftCompileVariant(例如 swiftCompileDebugswiftCompileRelease)扩展 mainVariantImplementation

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

nativeLinkVariant(例如 nativeLinkDebugnativeLinkRelease)扩展 mainVariantImplementation

用于将库链接到共享库。此配置包含库的库,因此在调用 Swift 链接器进行链接时使用。

nativeRuntimeVariant(例如 nativeRuntimeDebugnativeRuntimeRelease)扩展了 mainVariantImplementation

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

API 与实现

该插件公开了两种可用于声明依赖项的配置: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 配置中找到的依赖项不会暴露给使用者,因此不会泄漏到使用者的编译包含根目录和链接库中。这带来了几个好处

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

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

  • 当实现依赖项发生变化时,重新编译次数更少,因为使用者不需要重新编译

约定

Swift 库插件为源代码和任务添加了约定,如下所示。

项目布局

Swift 库插件假设项目布局如下所示。这些目录都不需要存在或包含任何内容。Swift 库插件将编译它找到的任何内容,并忽略任何缺失的内容。

src/main/swift

扩展名为 .swift 的 Swift 源代码

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

compileVariantSwift 任务

Swift 库插件为库组件的每个变体添加了一个 SwiftCompile 实例(例如 compileDebugSwiftcompileReleaseSwift)。阅读 构建变体简介 以了解更多信息。下面显示了一些最常见的配置选项。

编译器参数

[]

可调试

true

模块

configurations.swiftCompile_Variant_

[]

目标文件目录

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

优化

调试构建类型为false,其他情况为true

源代码

library.swiftSource

目标平台

从二进制文件的TargetMachine派生

工具链

根据目标机器自动选择

Swift 库插件为库的每个变体添加了一个LinkSharedLibrary 实例,其中包含共享链接作为维度 - 例如 linkDebuglinkRelease。有关更多信息,请阅读构建变体简介。下面显示了一些最常见的配置选项。

可调试

true

configurations.nativeLink_Variant_

链接文件

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

链接器参数

[]

源代码

compile_Variant_Swift.objects

目标平台

从二进制文件的TargetMachine派生

工具链

根据目标机器自动选择

create_Variant_ 任务

Swift 库插件为库的每个变体添加了一个CreateStaticLibrary 实例,其中包含静态链接作为维度 - 例如 createDebugcreateRelease。有关更多信息,请阅读构建变体简介。下面显示了一些最常见的配置选项。

输出文件

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

源代码

compile_Variant_Swift.objects

静态库参数

[]

目标平台

从二进制文件的TargetMachine派生

工具链

根据目标机器自动选择