swift-create-xcframework

重要提示

此项目已不再维护。建议您使用像 segment-integrations/swift-create-xcframework 这样的分支,它包含了对 Xcode 15 的支持。

swift-create-xcframework 是一个非常简单的工具,旨在封装 xcodebuild 以及为 Swift 包创建多个框架并将它们合并到一个单独的 XCFramework 中的过程。

在 2020 年 6 月 23 日,Apple 发布了 Xcode 12 和 Swift 5.3,并支持二进制目标。虽然它们提供了一种简化的方式来 在您的包中包含二进制框架,但它们没有提供一种简单的方式来创建您的 XCFramework,只有一些 关于漫长手动过程的文档。 swift-create-xcframework 弥合了这一差距。

注意: swift-create-xcframework 早于 WWDC20 公告,并在 Xcode 11.4 或更高版本中进行了测试,但应该适用于 Xcode 11.2 或更高版本。即使没有 Xcode 12,您也可以手动将生成的 XCFramework 包含在您的应用程序中。

用法

在您的 Swift 包文件夹中,您可以直接运行

swift create-xcframework

默认情况下,swift-create-xcframework 将为您的 Package.swift 中的所有 library 产品或您在命令行上指定的任何目标构建 XCFramework(这也可以用于您包含的任何依赖项)。

然后,对于每个指定的目标或产品,swift-create-xcframework 将会

  1. 为您的包生成一个 Xcode 项目(在 .build/swift-create-xcframework 中)。
  2. 为每个支持的平台/SDK 构建一个 .framework
  3. 使用 xcodebuild -create-xcframework 将特定于 SDK 的框架合并到一个 XCFramework 中。
  4. 可选地将其打包成一个 zip 文件,以便用于 GitHub 发布。

此过程镜像了 官方文档

选择要构建的内容

让我们使用一个示例 Package.swift

var package = Package(
    name: "example-generator",
    platforms: [
	    .ios(.v12),
    	 .macos(.v10_12)
    ],
    products: [
        .library(
            name: "ExampleGenerator",
            targets: [ "ExampleGenerator" ]),
    ],
    dependencies: [],
    targets: [
		...
	]
)

默认情况下,swift-create-xcframework 将构建支持以下平台的 ExampleGenerator.xcframework:macosx、iphoneos、iphonesimulator。额外的 .library 产品也将自动构建。

选择平台

您可以缩小构建范围。如果您省略平台规范,我们将为所有支持 Swift 二进制框架的平台构建,在撰写本文时,这些平台仅限于 Apple SDK:macosx、iphoneos、iphonesimulator、watchos、watchsimulator、appletvos、appletvsimulator。

注意: 因为目前仅支持 Apple 的平台,swift-create-xcframework 将忽略 Package.swift 中的 Linux 和其他平台。

您可以使用 --platform 选项指定要构建的平台子集,例如

swift create-xcframework --platform ios --platform macos ...

Catalyst

您可以通过在命令行上指定 --platform maccatalyst 来构建支持 Mac Catalyst 的 XCFramework。由于您无法在 Package.swift 中包含或排除 Catalyst 支持,因此我们不会尝试自动构建它。

选择产品

因为我们封装了 xcodebuild,所以实际上您可以从任何可以映射到 Xcode 项目作为 Framework 目标的内容构建 XCFramework。这包括您的 Package 拥有的所有依赖项。

查看可用内容

swift create-xcframework --list-products

然后选择要构建的内容

swift create-xcframework Target1 Target2 Target3...

默认情况下,它构建您的 Package.swift 中的所有顶级 library 产品。

命令行选项

由于使用 swift-argument-parser 添加命令行选项的低摩擦性,因此有许多有用的命令行选项可用,因此 --help 应该是您的首选。

打包以进行分发

swift-create-xcframework 提供了 --zip 选项,可以自动将您新创建的 XCFramework 打包成 zip 文件,以便上传到 GitHub 作为发布工件,或您选择的任何位置。

如果您正在创建 XCFramework 的目标恰好是一个依赖项,swift-create-xcframework 将回顾包图,找到该依赖项解析到的版本,并将版本号附加到您的 zip 文件名。例如:ArgumentParser-0.0.6.zip

如果您创建的目标是根包中的产品,则不幸的是,没有标准方法来识别版本号。对于这些情况,您可以使用 --zip-version 指定一个版本号。

因为您可能希望 将您的二进制框架作为 Swift 包分发,所以 swift create-xcframework --zip 也会计算必要的 SHA256 校验和,并将其与 zip 文件放在一起。例如:ArgumentParser-0.0.6.sha256

GitHub Action

swift-create-xcframework 包含一个 GitHub Action,当您在项目中标记发布版本时,它可以启动并自动创建 XCFramework。

该 action 为每个指定的目标生成一个压缩的 XCFramework 和校验和工件。

注意: 您必须使用基于 macOS 的 runner(例如 macos-latest),因为 xcodebuild 无法在 Linux 上运行。

然后,您可以将这些工件添加到您的发布版本中。

一个不完整的例子

.github/workflows/create-release.yml

name: Create Release

# Create XCFramework when a version is tagged
on:
  push:
    tags:

jobs:
  create_release:
    name: Create Release
    runs-on: macos-latest
    steps:

      - uses: actions/checkout@v2

      - name: Create XCFramework
        uses: unsignedapps/swift-create-xcframework@v2

      # Create a release
      # Upload those artifacts to the release

安装

您可以使用 mint 安装

mint install unsignedapps/swift-create-xcframework

或手动安装

git clone https://github.com/unsignedapps/swift-create-xcframework.git
cd swift-create-xcframework
make install

两者都应该将 swift-create-xcframework 二进制文件放到 /usr/local/bin 中。并且由于 swift 二进制文件是可扩展的,因此您可以将其作为 swift 本身的子命令调用

swift create-xcframework --help

贡献

请阅读 贡献指南,以了解如何为本项目做出贡献的详细信息。

许可证

swift-create-xcframework 在 MIT 许可证下可用。有关更多信息,请参阅 LICENSE 文件。