M1芯片Mac上Xcode使用fastlane已设UTF-8仍报编码错误如何解决
M1芯片Mac下Xcode构建触发fastlane UTF-8编码报错问题
报错现象
在搭载M1芯片的Mac设备上,通过Xcode构建iOS应用或在模拟器中运行应用时,触发fastlane相关报错,报错信息如下:
WARNING: fastlane requires your locale to be set to UTF-8. /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/pathname.rb:43:in `match?': [!] invalid byte sequence in US-ASCII (ArgumentError)
排查过程
- 定位到系统Ruby框架路径下的
pathname.rb文件第43行,对应代码如下,未从代码本身定位到问题根源:
def chop_basename(path) # :nodoc: base = File.basename(path) if /\A#{SEPARATOR_PAT}?\z/o.match?(base) return nil else return path[0, path.rindex(base)], base end end
- 检查终端交互环境下的locale配置,所有配置项均已设置为
en_US.UTF-8,但Xcode构建时仍然抛出相同错误,终端locale输出如下:
LANG="en_US.UTF-8" LC_COLLATE="en_US.UTF-8" LC_CTYPE="en_US.UTF-8" LC_MESSAGES="en_US.UTF-8" LC_MONETARY="en_US.UTF-8" LC_NUMERIC="en_US.UTF-8" LC_TIME="en_US.UTF-8" LC_ALL="en_US.UTF-8"
问题根因
Xcode作为GUI应用启动时,不会继承终端Shell中配置的locale环境变量。终端里查到的UTF-8配置仅对终端交互会话生效,Xcode拉起的构建、模拟器运行流程默认读取系统GUI层的环境变量,未配置UTF-8时会回退到US-ASCII编码,fastlane运行时检测到编码不符合要求、处理路径时遇到非ASCII字节就会抛出参数错误,pathname.rb是系统Ruby的标准库文件,本身代码不存在问题。
解决方法
- 方法1:给Xcode单独写入UTF-8环境变量
完全退出Xcode,在终端执行以下命令,将编码配置写入Xcode的偏好设置:
执行完成后重启Xcode,重新触发构建即可。defaults write com.apple.dt.Xcode LANG en_US.UTF-8 defaults write com.apple.dt.Xcode LC_ALL en_US.UTF-8 - 方法2:全局配置GUI应用层的编码环境变量
如果设备上其他GUI开发工具也存在同类编码报错,执行以下命令给所有GUI应用注入UTF-8编码配置:
执行后重启Xcode等相关应用生效,该配置单次系统重启后会失效,需要永久生效可以将上述命令添加到对应Shell配置文件(zsh对应launchctl setenv LANG en_US.UTF-8 launchctl setenv LC_ALL en_US.UTF-8~/.zshrc,bash对应~/.bash_profile)中,配置登录时自动加载。 - 方法3:在fastlane配置中强制指定编码
打开项目目录下的fastlane/Fastfile文件,在文件最顶部添加两行配置,强制fastlane运行时使用UTF-8编码:
保存后重新触发构建即可,该方法不需要修改系统或Xcode配置,仅作用于当前项目的fastlane流程。ENV['LANG'] = 'en_US.UTF-8' ENV['LC_ALL'] = 'en_US.UTF-8'
内容的提问来源于stack exchange,提问作者Xavier Duvan Melo
相关产品推荐
相关产品推荐

