Xcode 14.3中[CP] Embed Pods Frameworks构建脚本Bug及生成疑问
在Xcode 14.3中,Build Phases里的[CP] Embed Pods Frameworks阶段调用的Pods-myapp-frameworks.sh脚本,在处理位于符号链接文件夹中的框架时执行失败。问题出在脚本解析符号链接时返回相对路径,但实际需要绝对路径:
原脚本第42-45行:
if [ -L "${source}" ]; then echo "Symlinked..." source="$(readlink "${source}")" fi
添加-f参数让readlink返回绝对路径后,脚本恢复正常:
if [ -L "${source}" ]; then echo "Symlinked..." source="$(readlink -f "${source}")" fi
但手动修改脚本后,担心下次执行pod install/pod update时会被覆盖,以下是针对你疑问的解答:
1. 该脚本的来源
Pods-myapp-frameworks.sh是CocoaPods自动生成的构建脚本,属于CocoaPods负责嵌入框架的核心逻辑部分。每次执行pod install或pod update时,CocoaPods会根据你的Podfile、项目配置以及当前安装的CocoaPods版本,从内置的脚本模板生成该文件,存放在项目的Pods/Target Support Files/Pods-myapp/目录下。
2. 如何让脚本自动生成带有readlink -f的代码
有两种可行方案:
- 临时自动修复方案:在Podfile中添加
post_install钩子,每次执行pod install后自动修改脚本内容。在你的Podfile末尾添加以下代码:
post_install do |installer| framework_script_path = "Pods/Target Support Files/Pods-myapp/Pods-myapp-frameworks.sh" if File.exist?(framework_script_path) script_content = File.read(framework_script_path) # 替换readlink为readlink -f updated_content = script_content.gsub(/readlink "\${source}"/, 'readlink -f "${source}"') File.write(framework_script_path, updated_content) puts "Updated #{framework_script_path} to use readlink -f for symlinks" end end
替换其中的myapp为你的项目Target名称,这样每次执行pod install后,脚本会自动被修改为正确的逻辑。
- 长期修复方案:
- 升级CocoaPods到最新稳定版本:这个符号路径解析的问题可能已经在后续版本的CocoaPods中被修复,执行
gem install cocoapods升级后重新执行pod install验证。 - 如果升级后问题仍存在,可以前往CocoaPods的官方代码仓库提交Issue,描述你的场景和修复方案,官方可能会在后续版本中合并该修复。
- 升级CocoaPods到最新稳定版本:这个符号路径解析的问题可能已经在后续版本的CocoaPods中被修复,执行
3. 这是Xcode的Bug还是自身配置问题?
这个问题既不是Xcode的Bug,也不是你的项目配置问题,根源是CocoaPods生成脚本时的逻辑疏漏:macOS自带的是BSD版本的readlink,默认情况下返回相对路径,而脚本模板中没有考虑符号链接不在当前工作目录的情况,导致解析后的路径无效。Xcode只是负责执行CocoaPods生成的脚本,本身没有问题。
内容的提问来源于stack exchange,提问作者Kiwi

