如何在 xcode 13 中添加一个 Swift 包管理器作为动态库?

How to add a Swift package manager as a dynamic library in xcode 13?

我目前正在将一个项目的依赖管理器从 Carthage 切换到 Swift 包管理器,

例如,我们有领域依赖,在使用 Carthage 构建时,它曾经是一个动态框架,

但是在 SPM 中,当我尝试添加领域时,它默认提供一个领域静态框架,我找不到切换到动态的方法,

由于我们的项目中有一些子模块相互依赖,因此尝试 link 静态库会出现 duplicate symbols 错误。

如果我可以像 Carthage 一样直接下载 realm 作为动态框架,我会容易得多,

没有可供选择的选项

有人知道怎么做吗?

提前感谢您的帮助:)

包可以生成动态库,但它们必须明确地告诉 Xcode 它们希望将库制作成动态库。 Realm 不会这样做。相反,Realm 的人们采用默认行为,让 Xcode 决定构建静态库还是动态库。据我所知,Xcode总是选择构建静态库。

为了解决这个问题,您可以创建自己的包,将 Realm 包作为依赖项包含在内,并明确地使您的库动态化。你可以找到很多教程来教你如何制作一个包,所以我不会在这里详细介绍。

如果您创建一个包并将以下内容加载到您的 Package.swift 文件中,然后将该包导入到您的项目中,您的问题就解决了。我将我的包裹命名为“RealmUmbrella”,但您可以随意命名。

import PackageDescription

let package = Package(
    name: "RealmUmbrella",
    platforms: [.iOS(.v14)],
    products: [
        .library(
            name: "RealmUmbrella",
            type: .dynamic,
            targets: ["RealmUmbrella"]
        ),
    ],
    dependencies: [
        .package(name: "Realm", url: "https://github.com/realm/realm-cocoa", "10.0.0"..<"11.0.0")
    ],
    targets: [
        .target(
            name: "RealmUmbrella",
            dependencies: [.product(name: "RealmSwift", package: "Realm")]
        ),
    ]
)

请注意我在此处指定 .dynamic 的方式:

        .library(
            name: "RealmUmbrella",
            type: .dynamic,
            targets: ["RealmUmbrella"]
        ),

将伞包添加到我的项目后,我在项目导航器中单击项目文件,选择我的目标,然后导航到“常规”选项卡并向下滚动到“框架、库和嵌入式内容” .然后我在我的包的“嵌入”列中指定了“嵌入并签名”。

就是这样。