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很好。