如何在 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"]
),
将伞包添加到我的项目后,我在项目导航器中单击项目文件,选择我的目标,然后导航到“常规”选项卡并向下滚动到“框架、库和嵌入式内容” .然后我在我的包的“嵌入”列中指定了“嵌入并签名”。
就是这样。
我目前正在将一个项目的依赖管理器从 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"]
),
将伞包添加到我的项目后,我在项目导航器中单击项目文件,选择我的目标,然后导航到“常规”选项卡并向下滚动到“框架、库和嵌入式内容” .然后我在我的包的“嵌入”列中指定了“嵌入并签名”。
就是这样。