Ios 使用swift包裹内的吊舱

Ios 使用swift包裹内的吊舱,ios,xcode,swift-package-manager,Ios,Xcode,Swift Package Manager,我正在使用Swift Package Manager将我的应用程序模块化,方法是将应用程序的各个部分分为不同的层(包):演示、业务和数据,使其尽可能干净,并在项目设置->框架、库和嵌入内容部分将手动创建的包与项目链接。但是,在项目的某些部分,我仍然需要cococoa pod,为简单起见,我的pod文件包含以下内容: target 'SampleApp' do use_frameworks! pod 'Localize-Swift' end 当我将本地化Swift导入这些软件包的源

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

target 'SampleApp' do
  use_frameworks!
  
  pod 'Localize-Swift'
end
当我将
本地化Swift
导入这些软件包的源文件时,我得到了一个错误:
没有这样的模块
,但是Pods导入在应用程序的非打包部分(如
SceneDelegate
)运行良好。
我知道
SPM
依赖项只能是Swift包,但是,是否有任何已知的解决方法可以将POD链接到swift包中?

这是可能的,但它没有用处,因为swift包没有像XCode项目使用
-weak\u framework
那样弱链接到框架,所以您需要实现非琐碎的步骤

在swift软件包中,您可以指定链接到
linkedFramework
的框架:

.target(
名称:“MyPackage”,
依赖项:[],
链接设置:[
.linkedFramework(“本地化”)
.unsafeFlags([“-F/Users/user/../Localize Swift”])
]
),
其中
unsafeFlags
指定框架中dir的完整路径。但出乎意料的是,由于下一个问题,您无法将软件包与应用程序一起使用:

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

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

.target(
    name: "MyPackage",
    dependencies: [],
    linkerSettings: [
        .linkedFramework("Localize_Swift")
    ]
),
添加软件包后,您可以对应用程序执行相同的操作。如果将Localize_Swift.framework复制到应用程序的目标构建目录,则可以编译链接的Swift包,因为它在当前构建目录中查找
linkedFramework

默认情况下,POD生成到目标构建目录中的单独文件夹中,例如:
$target\u build\u dir/Localize Swift/Localize\u Swift.framework
,因此您可以在pods项目中更改
配置\u build\u dir
目标的
以将框架生成到目标构建目录的根目录,或制作脚本进行复制但是有一个问题,当您没有任何已编译的pod框架时,swift包依赖项会在编译过程的早期开始编译。因此,在第一阶段,您应该先编译Localize_Swift.framework(最好是制作fat框架),然后在目标方案中的
构建
下添加
预操作
运行脚本
,将框架从目标复制到目标构建目录

cp-r$PROJECT\u DIR/Localize\u Swift.framework$TARGET\u BUILD\u DIR/Localize\u Swift.framework
现在,您的应用程序和swift软件包都可以使用Localize_swift框架进行编译

正如我在开始时所说的,它没有用处,因为您需要在通用编译过程之前手动编译Localize_Swift.framework(或使用额外的脚本),从而完全消除cocoa pod的便利性

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

  • Pod作为swift软件包提供。您可以在软件包中创建依赖项,在这种情况下,您的软件包和依赖项也将在应用程序中可用。顺便说一下,本地化支持Swift包
  • Pod有swift来源您可以使用来源文件制作自己的swift包,然后将其链接到您的包

  • Pod具有Swift 5.3中的二进制文件,Swift包可以嵌入
    xcframework
    ,因此您可以从Pod的二进制文件构建此xcframework,然后在您的Swift包中建立二进制目标依赖关系:
    .binaryTarget(名称:“MyLib”,路径:“MyLib.xcframework”)
    (请参阅)


  • 非常感谢您的详细解释,选项1和2很好。