如何在Xcode 13中将Swift包管理器添加为动态库?

5

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

例如我们之前使用Carthage构建时,Realm的依赖关系是动态框架(dynamic framework),

但在使用SPM时,试图添加Realm时,默认提供的是静态框架(static framework),我找不到切换到动态框架的方法,

由于我们的一些子模块彼此依赖,试图链接静态库会导致重复符号(duplicate symbols)错误。

如果我能像使用Carthage一样直接下载Realm作为动态框架,那将会更容易,

没有选择选项 enter image description here

enter image description here

有人知道如何做吗?

谢谢您提前的任何帮助:)

1个回答

6
包可以生成动态库,但它们必须明确地告诉 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"]
        ),

一旦我将我的Umbrella包添加到项目中后,我点击项目导航器中的项目文件,选择我的目标,然后导航到“General”选项卡并向下滚动到“框架、库和嵌入式内容”。接着在“嵌入”列中为我的包指定“嵌入并签名”。

enter image description here

就是这样了。

谢谢Rob,这真的很有帮助! - Lucas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接