如何修复Ruby on Rails下Nokogiri的架构不兼容加载错误
报错本质是架构不匹配:你当前RVM安装的Ruby 2.6.3是x86_64(Intel)架构编译的,但bundler自动拉取了arm64(Apple Silicon)架构的Nokogiri预编译动态库,跨架构加载就会直接触发LoadError。
Traceback里出现的bootsnap、spring只是因为本地缓存了之前错误的加载链路,属于连带报错,不是这两个组件本身的配置问题。
1. 先确认本地Ruby的实际运行架构
在项目根目录终端执行:ruby -e 'puts RbConfig::CONFIG["arch"]'
如果输出是x86_64-darwin20,就完全对应报错的场景——Intel架构的Ruby硬要加载arm64编译的Nokogiri包。
2. 清空所有关联的旧缓存和残留安装
这步是很多人修复失败的核心原因,不做的话旧配置会一直覆盖新的安装结果:
- 停止所有后台常驻的spring进程:
spring stop - 删掉项目里bootsnap生成的全量缓存:
rm -rf tmp/cache/bootsnap* - 强制卸载本地所有已安装的Nokogiri版本,避免残留架构不匹配的包:
gem uninstall nokogiri --force --executable
执行后如果弹出多版本选择提示,全选删除即可,直到本地没有任何Nokogiri残留。
3. 强制安装和Ruby架构匹配的Nokogiri
不要用默认的自动预编译包匹配,直接指定安装x86_64架构的版本:gem install nokogiri -v '1.11.1' --platform=x86_64-darwin -- --use-system-libraries
如果1.11.1版本没有对应的x86_64预编译包,就直接放宽Gemfile里的Nokogiri版本限制,改成
gem 'nokogiri', '~> 1.13',只要是适配x86_64 darwin20的稳定版本,都能兼容Ruby 2.6.3的运行环境。
4. 重置项目依赖锁文件
旧的Gemfile.lock里还存着arm64版本Nokogiri的条目,必须清掉再重新生成:
- 从锁文件里移除Nokogiri的旧条目:
bundle lock --remove nokogiri - 重新拉取匹配当前架构的依赖:
bundle install - 验证Nokogiri是否能正常加载:
bundle exec ruby -e 'require "nokogiri"; puts "Nokogiri 加载正常,版本: #{Nokogiri::VERSION}"'
这步如果没有报错输出,就说明架构匹配的问题已经解决。
5. 最终启动验证
依次执行下面的命令,确认全流程没有报错:
- 启动控制台:
bin/rails c - 启动开发服务:
bin/rails s
- 不要在Rosetta模拟终端和原生Apple Silicon终端之间反复切换跑项目,很容易导致RVM的Ruby编译架构混乱,最好固定用同一种终端环境开发。
- 不要随便升级Ruby 2.6.3的小版本,Big Sur 11.1下RVM安装的2.6.3默认就是x86_64架构,只要匹配对Nokogiri的架构就能稳定运行。
- 如果反复清缓存还是报错,可以临时把Gemfile里的
bootsnap、spring注释掉,重新bundle install后验证基础加载是否正常,确认没问题再加回这两个依赖,排除旧缓存的干扰。
内容的提问来源于stack exchange,提问作者Alice Sun

