如何从 SwiftPM 生成的 XCode 项目生成框架?

How to generate a framework from a SwiftPM-generated XCode project?

我使用 SwiftPM 为一个框架建立了一个 XCode 项目;基于

// swift-tools-version:4.0

import PackageDescription

let package = Package(
    name: "MyThing",
    products: [
        .library(
            name: "MyThing",
            targets: ["MyThing"]),
    ],
    dependencies: [
    ],
    targets: [
        .target(
            name: "MyThing",
            dependencies: [])
)

I 运行 swift package generate-xcodeproj 然后是 pod install(基于内容无关紧要的 Podfile)。我得到 MyThing.xcworkspace.

现在我想

xcodebuild -workspace MyThing.xcworkspace -scheme MyThing clean build

应该创建 .framework -- 但它没有,只出现一个二进制文件。我怀疑这里有一些自动化在起作用,因为源文件夹包含一个名为 main.swift 的文件,等等。

我需要做什么才能构建框架?
我需要编写整个过程的脚本,请不要手动解决方法。

截至 Swift 4.0 swift package generate-xcodeproj 不会自动为所有目标生成方案,但仍然可以从 Xcode 访问这些目标。

如果可以接受一次手动创建新方案,您可以这样做并将您的框架目标添加为方案构建目标。

否则,可以使用 xcodeswift/xcproj 等库以编程方式创建新方案,它允许您解析新生成的 Xcode 项目并使用其 XCSharedData class.

创建新框架方案后,您可以 运行 使用 xcodebuild -workspace MyThing.xcworkspace -scheme MyThingFramework clean build 进行构建。

在一个目标中混合脚本文件和框架代码似乎会使 SwiftPM 感到困惑。将 main.swift 移出源文件夹可以清理一切。

方案 MyThing-Package 创建 Package.swift 中指定的所有构建产品,包括框架。

如果您想将脚本文件放在同一个 XCode 工作区(为了编辑方便),请将它们放在自己的目标中。您甚至可以创建一个可执行产品(这不会创建任何有用的东西,因为可执行文件不能 link 到动态框架)。