我正在使用 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 Script
在 Build
下在将框架从目标复制到目标构建目录的目标方案中。cp -r $PROJECT_DIR/Localize_Swift.framework $TARGET_BUILD_DIR/Localize_Swift.framework
现在您的应用程序和您的 swift 包都可以使用 Localize_Swift 框架进行编译。正如我在开头所说的那样,它没有用,因为您需要在完全抵消 cocoa pod 的便利性的一般编译过程之前手动编译 Localize_Swift.framework(或使用附加脚本)。
考虑使用下一个首选选项:
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/