Swift Package如何链接到iOS应用?

t0ybt7op  于 2023-10-15  发布在  Swift
关注(0)|答案(1)|浏览(103)

我有一个Xcode项目,有一个应用程序Target,然后是一些Swift包依赖项。然后,我在目标配置的常规选项卡的 FrameworksLibrariesEmbedded 内容部分中添加这些依赖项。
在构建之后,这些依赖项将变成什么样的二进制格式,以及它们是静态还是动态地链接到主应用程序?有没有办法控制这个过程?
我没有找到关于它的明确文件。

ecbunoof

ecbunoof1#

链接取决于作者如何创建每个库。在Package.swift中,您应该检查特定SPM的方法library(name:type:targets:)。如果type参数存在,它将指定库类型和链接类型:.static.dynamic,您可以在创建自己的SPM时指定类型,链接:Product.Library.LibraryType .否则,在大多数情况下,这个参数是避免和苹果说:
用于确定如何链接到库的库的可选类型。保留此参数,以便Swift包管理器可以在静态或动态链接之间进行选择(推荐)。如果不支持这两种链接类型,请对此参数使用Product.Library.LibraryType.static或Product.Library.LibraryType.dynamic。
范例:

let package = Package(name: "Alamofire",
                  platforms: [.macOS(.v10_12),
                              .iOS(.v10),
                              .tvOS(.v10),
                              .watchOS(.v3)],
                  products: [.library(name: "Alamofire",
                                      targets: ["Alamofire"])],
                  targets: ...

静态类型示例:

let package = Package(
name: "IGListKit",
platforms: [ .iOS(.v9),
             .tvOS(.v9),
             .macOS(.v10_15),
],
products: [
    .library(name: "IGListDiffKit",
             type: .static ,
             targets: ["IGListDiffKit"]),
    .library(name: "IGListKit",
             type: .static,
             targets: ["IGListKit"])
],
targets: ...

动态类型示例:

var products: [Product] = [
.library(
    name: "SwiftGodot",
    type: .dynamic,
    targets: ["SwiftGodot"]),
.plugin(name: "CodeGeneratorPlugin", targets: ["CodeGeneratorPlugin"]),]

我找到了一些资源,以防LibraryType为nil,Xcode默认在将包链接到应用程序时构建静态库:Swift Package Manager dynamic libraryWWDC NOTES: Creating Swift Packages .
我建议在避免使用nil类型时依靠Apple文档,否则在需要特定链接类型时指定确切的LibraryType。这里有一些有用的链接,可以深入挖掘:SwiftPM and dynamic linkingPackageDescription .上面提到的是基于源代码的包依赖关系。如果你需要二进制依赖:Identifying binary dependenciesDistributing binary frameworks as Swift packages .我希望这些信息对你有帮助。

相关问题