Scipio

GitHub Workflow Status (with event) Swift 6.0 Xcode 16.2 SwiftPM Documentation Platforms License

迦太基必须毁灭 (Carthago delenda est)

Scipio 提出了一种新的工作流程,用于将依赖项集成到您的应用程序中。

该产品的灵感主要来自 Carthageswift-create-xcframework

摘要

SwiftPM 是将依赖项集成到您的应用程序中的最佳方式。但是,Xcode 构建的构建产物很难缓存。

另一方面,XCFramework 是一种保持二进制文件可移植性的好方法。

Scipio 提供了一种新的混合方式来管理依赖项。

首先,使用 SwiftPM 解析依赖项并检出存储库。之后,此工具将每个依赖项转换为 XCFramework。

用法

有关详细信息,请参见 Scipio 官方文档

安装

安装 Scipio 最简单的方法是使用 nestnest install giginet/Scipio

准备应用程序的所有依赖项

Scipio 的概念是,所有需要在应用程序中使用的依赖项都应该在一个 Package 清单中定义。

prepare 命令是将清单中的所有依赖项构建为 XCFramework。

这种模式称为 prepare 模式。 有关详细信息,请参见 为您的应用程序准备所有依赖项

定义 Package.swift 以描述您的应用程序的依赖项

// swift-tools-version: 6.0
// The swift-tools-version declares the minimum version of Swift required to build this package.

import PackageDescription

let package = Package(
    name: "MyAppDependencies",
    platforms: [
        // Specify platforms to build
        .iOS(.v14),
    ],
    products: [],
    dependencies: [
        // Add dependencies
        .package(url: "https://github.com/onevcat/APNGKit.git", exact: "2.2.1"),
    ],
    targets: [
        .target(
            name: "MyAppDependency",
            dependencies: [
                // List all dependencies to build
                .product(name: "APNGKit", package: "APNGKit"),
            ]),
    ]
)

运行 prepare 命令

$ scipio prepare path/to/MyAppDependencies
> 🔁 Resolving Dependencies...
> 🗑️ Cleaning MyAppDependencies...
> 📦 Building APNGKit for iOS
> 🚀 Combining into XCFramework...
> 📦 Building Delegate for iOS
> 🚀 Combining into XCFramework...
> ❇️ Succeeded.

默认情况下,所有 XCFrameworks 都会生成到 MyAppDependencies/XCFramework 中。

库演进支持

默认情况下,Scipio 禁用对 库演进 功能的支持。

这意味着构建的框架只能从使用相同 Swift 版本构建的产品中使用。

主要原因是库演进的限制。 事实上,有些包在启用库演进的情况下无法构建。(https://developer.apple.com/forums/thread/123253, apple/swift-collections#94, apple/swift-nio#1257)

如果您想分发生成的 XCFrameworks,建议启用库演进。 如果需要,请传递 --enable-library-evolution 标志。 但是,这意味着某些包可能无法构建。

构建缓存系统

默认情况下,Scipio 会检查是否需要为现有的 XCFrameworks 重新构建。

$ swift run scipio prepare --cache-policy project path/to/MyAppDependencies
> 🔁 Resolving Dependencies...
> 🗑️ Cleaning MyAppDependency...
> ✅ Valid APNGKit.xcframework is exists. Skip building.
> ✅ Valid Delegate.xcframework is exists. Skip building.
> ❇️ Succeeded.

Scipio 支持项目/本地磁盘/远程磁盘缓存后端。

使用远程缓存,在开发者之间共享构建的 XCFrameworks。

有关详细信息,请参见 了解缓存系统

从单个 Swift 包创建 XCFramework

Scipio 还可以从特定的 Swift 包生成 XCFrameworks。 此功能类似于 swift-create-xcframework。

$ scipio create path/to/MyPackage
> 🔁 Resolving Dependencies...
> 🗑️ Cleaning MyPackage...
> 📦 Building MyPackage for iOS
> 🚀 Combining into XCFramework...
> ❇️ Succeeded.

有关详细信息,请参见 将单个 Swift 包转换为 XCFramework

支持的 Xcode 和 Swift 版本

目前,我们支持 Swift 6.0。

Xcode Swift
16.2 6.0

可靠性

Scipio 仅使用标准依赖项和 Apple 官方工具进行构建,以保持可靠性。

如何解析依赖项

只需运行 swift package resolve

如何解析包清单并生成 Xcode 项目

Scipio 依赖于 swift-package-manager 作为一个库。

解析包清单和生成 Xcode 项目由该包提供。 因此,它将在未来得到维护。

如何构建 XCFrameworks

Scipio 仅使用 xcodebuild 来构建 Frameworks 和 XCFrameworks。

为什么选择 Scipio

Scipio 的名字来源于一个关于迦太基的历史故事。