在 swift 包中使用 pod

JAH*_*lia 4 xcode ios swift-package-manager

Swift Package Manager通过将应用程序的各个部分分成不同的层(包)来使我的应用程序模块化:演示文稿、业务和数据以使其尽可能干净,我将这些手动创建的包与项目设置中的项目链接 ->框架、库和嵌入式内容部分。但是,我Cocoa Pods在项目的某些部分仍然需要,为简单起见,我的 pod 文件包含以下内容:

target 'SampleApp' do
  use_frameworks!
  
  pod 'Localize-Swift'
end
Run Code Online (Sandbox Code Playgroud)

当我将 导入Localize-Swift到这些包的源文件之一时,出现错误:No such module,但是 Pods 导入在应用程序的非打包部分中运行良好,例如SceneDelegate. 我知道SPM依赖项只能是 Swift 包,但是是否有任何已知的解决方法可以将 pod 链接到 swift 包?

iUr*_*rii 7

这是可能的,但它没有用,因为 Swift 包不像 XCode 项目那样具有与框架的弱链接,-weak_framework <framework_name>因此您需要实现非平凡的步骤。

在 swift 包中,您可以指定要链接的框架linkedFramework

.target(
    name: "MyPackage",
    dependencies: [],
    linkerSettings: [
        .linkedFramework("Localize_Swift")
        .unsafeFlags(["-F/Users/user/.../Localize-Swift"])
    ]
),
Run Code Online (Sandbox Code Playgroud)

whereunsafeFlags指定框架的 dir 的完整路径。但出乎意料的是,由于下一个问题,您无法将您的包与您的应用程序一起使用:

包产品“MyPackage”不能用作此目标的依赖项,因为它使用了不安全的构建标志。

要使用您的框架编译 Swift 包,您应该将 Localize_Swift.framework 复制到包的目标构建目录,然后您可以省略包的不安全构建标志,因为编译器会看到目录根级别上的所有依赖项。

.target(
    name: "MyPackage",
    dependencies: [],
    linkerSettings: [
        .linkedFramework("Localize_Swift")
    ]
),
Run Code Online (Sandbox Code Playgroud)

添加软件包后,您可以对应用程序执行相同的操作。如果您将 Localize_Swift.framework 复制到应用程序的目标构建目录,则可以编译链接的 swift 包,因为它会linkedFramework在当前构建目录中查找。

默认情况下,舱体产生于目标build目录如单独的文件夹:$TARGET_BUILD_DIR/Localize-Swift/Localize_Swift.framework这样你就可以改变CONFIGURATION_BUILD_DIRLocalise-Swift豆荚项目目标产生的框架为目标build目录的根目录或使脚本复制等。但有一个问题,即迅速当您没有任何已编译的 pod 框架时,包依赖项在编译过程的早期开始编译。因此,在第一阶段,您应该先编译 Localize_Swift.framework(最好制作一个胖框架),然后在目标方案中添加一个Pre-actions Run ScriptunderBuild将框架从目标复制到目标构建目录。

.target(
    name: "MyPackage",
    dependencies: [],
    linkerSettings: [
        .linkedFramework("Localize_Swift")
    ]
),
Run Code Online (Sandbox Code Playgroud)

现在,您的应用程序和 swift 包都可以使用 Localize_Swift 框架进行编译。

正如我在开头所说的那样,它没有用,因为在完全抵消可可豆的便利性的一般编译过程之前,您需要手动(或使用附加脚本)编译 Localize_Swift.framework。

考虑使用下一个首选选项:

  1. Pod 可作为 swift 包使用。您可以在您的包中创建一个依赖项,在这种情况下,您的包和依赖项也将在您的应用程序中可用。顺便说一下 Localize_Swift 支持 swift 包。
  1. Pod 具有 swift 源您可以使用源文件制作自己的 swift 包,然后将其链接到您的包。

  2. Pod 具有来自 Swift 5.3 swift 包的二进制文件可以嵌入,xcframework因此您可以从 pod 的二进制文件构建此 xcframework,然后在您的 swift 包中创建二进制目标依赖项:(.binaryTarget(name: "MyLib", path: "MyLib.xcframework")请参阅如何在 Swift 包管理器中添加本地库作为依赖项