Mac M1设备Xcode归档时readlink非法选项-f错误及后续问题
Mac M1 Xcode Archive 报错解决指南
问题根源
M1 Mac搭载的是BSD系的readlink工具,不支持GNU版本的-f参数,而Xcode打包时生成的Pod框架脚本(*-frameworks.sh)中使用了readlink -f,触发readlink: illegal option -- f错误;直接移除-f后,又会因为路径不是绝对路径引发Rsync传输失败(code 23)。
有效解决方案
方案一:修改Podfile脚本,替换为BSD兼容的绝对路径写法
替换原有无效的post_install脚本,改用BSD支持的方式获取绝对路径:
post_install do |installer| installer.pods_project.targets.each do |target| shell_script_path = "Pods/Target Support Files/#{target.name}/#{target.name}-frameworks.sh" next unless File.exist?(shell_script_path) script_content = File.read(shell_script_path) # 用realpath替换readlink -f(M1 macOS自带realpath) script_content = script_content.gsub(/readlink -f/, 'realpath') File.write(shell_script_path, script_content) end end
修改后执行pod install,再尝试Archive即可。如果系统没有realpath,可以把替换逻辑改成:
script_content = script_content.gsub(/source="\$\(readlink -f "\${source}"\)"/, 'source="$(cd "$(dirname "${source}")" && pwd)/$(basename "${source}")"')
方案二:手动修改框架脚本(临时应急)
找到对应Target的*-frameworks.sh文件(路径:Pods/Target Support Files/[你的Target名]/[你的Target名]-frameworks.sh),将所有readlink -f替换为realpath,或者替换成以下shell代码:
source="$(cd "$(dirname "${source}")" && pwd)/$(basename "${source}")"
保存后重新执行Archive操作。
方案三:安装GNU版readlink(依赖Homebrew)
- 通过Homebrew安装GNU核心工具:
brew install coreutils
- 修改
*-frameworks.sh脚本,将readlink -f替换为greadlink -f(GNU版readlink的命令名为greadlink) - 确保Xcode执行脚本时能找到greadlink,可在脚本开头添加:
PATH="/usr/local/bin:$PATH"
原有Pod脚本无效的原因
你之前添加的脚本是将无-f的readlink替换为带-f的版本,这反而会在更多地方引入不支持的参数,加重报错,完全搞反了修复逻辑。
内容的提问来源于stack exchange,提问作者Terminator
相关产品推荐
相关产品推荐

