gpt4 book ai didi

ios - 从 swift 包中使用 pod

转载 作者:行者123 更新时间:2023-12-01 16:11:19 25 4
gpt4 key购买 nike

我正在使用 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 thistarget 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/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com