Apple M1(Rosetta模式)下React Native项目Xcode构建iOS归档失败求助
我之前在M1 Mac上用Rosetta运行React Native 0.63项目归档时,碰到过和你一模一样的问题!你试过的pod reintegrate、删锁文件这些操作我当时也都试过,后来发现是Shell环境和Pods脚本的严格变量检查冲突导致的,给你几个亲测有效的解决办法:
解决方法
方法一:通过Podfile自动修复脚本(推荐)
在iOS目录下的Podfile末尾添加这段配置,它会自动修改Pods的框架脚本,关闭未绑定变量的严格检查,同时指定用bash运行:
post_install do |installer| # 遍历所有target,调整Shell配置 installer.pods_project.targets.each do |target| target.build_configurations.each do |config| config.build_settings['SHELL_PATH'] = '/bin/bash' end end # 给Pods-SagaReserve-frameworks.sh添加set +u,取消未绑定变量报错 framework_script = File.join(installer.pods_project.path.parent, 'Target Support Files/Pods-SagaReserve/Pods-SagaReserve-frameworks.sh') if File.exist?(framework_script) content = File.read(framework_script) # 只在开头没加过的情况下添加 unless content.start_with?('set +u') File.write(framework_script, "set +u\n#{content}") end end end
添加完成后,执行:
cd ios pod install
然后重新打开Xcode尝试归档。
方法二:手动修改Xcode的构建阶段
如果方法一没生效,可以直接修改Xcode里的构建脚本:
- 打开Xcode,选中你的项目target
SagaReserve,切换到Build Phases标签 - 找到
[CP] Embed Pods Frameworks这一项,双击打开脚本编辑界面 - 在脚本的最开头添加一行:
set +u(这行命令会关闭"未绑定变量即报错"的严格模式) - 同时把顶部的
Shell选项从/bin/sh改成/bin/bash
保存后重新归档试试。
方法三:调整终端的默认Shell
如果你的Mac默认用的是zsh,在Rosetta环境下可能会有变量传递问题:
- 打开终端,右键点击Dock里的终端图标,选择「显示简介」,勾选「使用Rosetta打开」
- 在终端里执行命令:
chsh -s /bin/bash,把默认Shell改成bash - 重启终端和Xcode,再尝试归档
问题原因
这个错误source: unbound variable是因为Pods的框架脚本启用了set -u严格模式(遇到未定义的变量就终止执行),而在M1+Rosetta的混合环境下,某些环境变量没有被正确传递,触发了这个检查。上面的方法要么关闭了严格检查,要么切换到兼容性更好的bash环境,就能解决问题。
内容的提问来源于stack exchange,提问作者Haren Sarma
相关产品推荐
相关产品推荐

