使用 swift 包中的 pod

Using a pod from inside a swift package

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

target 'SampleApp' do
  use_frameworks!
  
  pod 'Localize-Swift'
end

当我将 Localize-Swift 导入这些包的源文件之一时,我收到错误:No such module,但是 Pods 导入在应用程序的非打包部分运行良好喜欢 SceneDelegate。 我知道 SPM 依赖项只能是 Swift 包,但是是否有任何已知的解决方法可以将 link pods 转换为 swift 包?

有可能,但没用因为Swift包对框架的link不像XCode项目那样弱-weak_framework <framework_name> 因此您需要执行重要的步骤。

在 swift 包中,您可以使用 linkedFramework:

指定 link 的框架
.target(
    name: "MyPackage",
    dependencies: [],
    linkerSettings: [
        .linkedFramework("Localize_Swift")
        .unsafeFlags(["-F/Users/user/.../Localize-Swift"])
    ]
),

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

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 复制到应用程序的目标构建目录,那么可以编译您的 linked swift 包,因为它会在当前构建目录中查找 linkedFramework

默认生成 pods 以分隔目标构建目录中的文件夹,例如:$TARGET_BUILD_DIR/Localize-Swift/Localize_Swift.framework 因此您可以在 Pods 中为 Localise-Swift 目标更改 CONFIGURATION_BUILD_DIR项目将框架生成到目标构建目录的根目录或制作要复制的脚本等。但是存在一个问题,即 swift 包依赖项在编译过程的早期开始编译,而你没有任何已编译的 pod 框架。所以在第一阶段你应该编译你的 Localize_Swift.framework 之前(最好做一个胖框架)然后在你的目标方案中的 Build 下添加一个 Pre-actions Run Script 复制从您的目的地到目标构建目录的框架。

cp -r $PROJECT_DIR/Localize_Swift.framework $TARGET_BUILD_DIR/Localize_Swift.framework

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

正如我在开始时所说,它没有用,因为您需要在一般编译过程之前手动编译 Localize_Swift.framework(或使用其他脚本),这会抵消 cocoa [=77= 的便利性] 完全没有。

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

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

  2. Pod 有二进制文件 来自 Swift 5.3 swift 包可以嵌入 xcframework 所以你可以从构建这个 xcframework pod 的二进制文件,然后在你的 swift 包中创建二进制目标依赖项:.binaryTarget(name: "MyLib", path: "MyLib.xcframework")(参见