ios - 从 swift 包中使用 pod

标签 ios xcode swift-package-manager

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

target 'SampleApp' do
  use_frameworks!
  
  pod 'Localize-Swift'
end
当我导入 Localize-Swift进入这些软件包的源文件之一,我收到错误:No such module ,但是 Pod 导入在应用程序的未打包部分(如 SceneDelegate)中运行良好.
我知道SPM依赖项只能是 Swift 包,但是是否有任何已知的解决方法可以将 pod 链接到 swift 包中?

最佳答案

有可能,但 没用因为 Swift 包没有像 XCode 项目对 -weak_framework <framework_name> 那样对框架的弱链接。所以你需要实现非平凡的步骤。
在 swift 包中,您可以指定一个框架来链接 linkedFramework :

.target(
    name: "MyPackage",
    dependencies: [],
    linkerSettings: [
        .linkedFramework("Localize_Swift")
        .unsafeFlags(["-F/Users/user/.../Localize-Swift"])
    ]
),
在哪里 unsafeFlags使用框架指定 dir 的完整路径。但出乎意料的是,由于下一个问题,您无法将您的包与您的应用程序一起使用:

The package product 'MyPackage' cannot be used as a dependency of this target because it uses unsafe build flags.


要使用您的框架编译 Swift 包,您应该将 Localize_Swift.framework 复制到包的目标构建目录,然后您可以省略包的不安全构建标志,因为编译器会看到目录根级别上的所有依赖项。
.target(
    name: "MyPackage",
    dependencies: [],
    linkerSettings: [
        .linkedFramework("Localize_Swift")
    ]
),
添加包后,您可以对应用执行相同操作。如果将 Localize_Swift.framework 复制到应用程序的目标构建目录,则可以编译链接的 swift 包,因为它会查找 linkedFramework在当前的构建目录中。
默认情况下,会生成 pod 以分隔目标构建目录中的文件夹,例如:$TARGET_BUILD_DIR/Localize-Swift/Localize_Swift.framework所以你可以改变CONFIGURATION_BUILD_DIR对于 Localise-Swift在 Pods 项目中的 target 来生成框架到目标构建目录的根目录或制作脚本来复制等。但是有一个问题是 swift 包依赖项在编译过程的早期开始编译,而你没有任何编译的 pod 框架。所以在第一阶段你应该先编译你的 Localize_Swift.framework(最好是做一个胖框架),然后添加一个 Pre-actions Run ScriptBuild 下在将框架从目标复制到目标构建目录的目标方案中。
cp -r $PROJECT_DIR/Localize_Swift.framework $TARGET_BUILD_DIR/Localize_Swift.framework
现在您的应用程序和您的 swift 包都可以使用 Localize_Swift 框架进行编译。
正如我在开头所说的那样,它没有用,因为您需要在完全抵消 cocoa pod 的便利性的一般编译过程之前手动编译 Localize_Swift.framework(或使用附加脚本)。
考虑使用下一个首选选项:
  • Pod 可作为 swift 包使用。 您可以在包中创建依赖项,在这种情况下,您的包和依赖项也将在您的应用程序中可用。顺便说一下 Localize_Swift 支持 swift 包。
  • Pod 有快速的资源 您可以使用源文件制作自己的 swift 包,然后将其链接到您的包。
  • Pod 有二进制文件 从 Swift 5.3 Swift 包可以嵌入 xcframework所以你可以从 pod 的二进制文件构建这个 xcframework,然后在你的 swift 包中创建二进制目标依赖:.binaryTarget(name: "MyLib", path: "MyLib.xcframework") (见 How can I add a local library as a dependency in Swift Package Manager)
  • 关于ios - 从 swift 包中使用 pod,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63700091/

    相关文章:

    Swift 包管理器无法编译通过 Homebrew 安装的 ncurses

    ios - 在类中设置和删除布局

    iphone - 为什么 XCode 每次都会将资源复制到 iDevice,即使它们仍未更改?

    java - 尝试使用 javapns 向 Apple 推送通知服务发送通知

    ios - Appcode - 选择当前文件

    iphone - 为 NSTimer 添加暂停功能

    Swift 包管理器 (spm) 协议(protocol),在项目中未被识别

    xcode11 - 为 Xcode SPM 测试复制资源文件

    iOS 在运行时更改应用程序图标

    ios - 为什么这不会崩溃?