使用CocoaPods引入XCFramework:源码与预编译包安装逻辑疑问
我目前了解如何在PodSpec中打包代码,参考相关博客配置了如下PodSpec:
Pod::Spec.new do |spec| spec.name = "StarWars" spec.version = "1.0.0" spec.summary = "Star Wars Library for iOS apps" spec.description = "..." spec.homepage = "..." spec.documentation_url = "..." spec.license = { :type => "MIT" } spec.author = { "Star Wars" => "..." } spec.source = { :git => 'your repo here', :tag => "#{spec.version}" } spec.swift_version = "5.3" # Supported deployment targets spec.ios.deployment_target = "10.0" # Published binaries vendored_frameworks = "StarWarsKit.xcframework" end
但我有几个疑问:
- 当使用
pod 'StarWarKit', '~> 3.0'这类命令时,CocoaPods会选择安装预编译的XCFramework,还是拉取源码编译后安装? - StackOverflow上曾提到需要用两个PodSpec来区分,但没有公认答案,当前CocoaPods版本中这个问题是否仍存在?
- 新版本CocoaPods有没有解决方案?
- 上述博客的PodSpec配置是否有误?
- 这种配置会不会在后台同时安装源码与框架?
解答
当前CocoaPods的行为逻辑
你配置的这个PodSpec里,vendored_frameworks仅定义了变量但未关联到spec属性,这种情况下CocoaPods会忽略该配置,转而尝试从source指向的Git仓库拉取源码编译。如果修正配置后(将变量赋值给spec.vendored_frameworks),CocoaPods会优先使用预编译框架——它会从Git仓库拉取包含XCFramework的代码包,直接使用这个预编译文件,不会去编译源码。是否需要两个PodSpec?
在当前最新的CocoaPods版本中,依然没有官方的单一PodSpec同时支持源码和预编译框架切换的功能。如果需要让用户自主选择安装方式,最常用的方案还是维护两个PodSpec:- 一个专注源码分发:不设置
vendored_frameworks,用source_files指定源码路径 - 一个专注二进制分发:设置
spec.vendored_frameworks,可在spec名称上做区分(比如StarWarsKit-bin)
用户通过选择不同的pod名称来决定安装类型,比如pod 'StarWarsKit'安装源码,pod 'StarWarsKit-bin', '~> 3.0'安装预编译框架。
- 一个专注源码分发:不设置
你提供的PodSpec配置问题
配置存在一处关键错误:vendored_frameworks需要赋值给spec.vendored_frameworks,而非单独定义变量。正确写法如下:spec.vendored_frameworks = "StarWarsKit.xcframework"原配置中仅定义变量的操作不会被CocoaPods识别,会导致框架无法被正确加载,进而触发源码编译的逻辑。
是否会同时安装源码与框架?
修正配置后,不会同时安装。当spec.vendored_frameworks配置正确时,CocoaPods会将该pod判定为二进制分发类型,只会从Git仓库拉取并使用指定的XCFramework文件,即便仓库中同时存在源码,也不会对源码进行编译或安装操作。
内容的提问来源于stack exchange,提问作者mfaani

