Mac M3(Sonoma系统)无法bundle安装nio4r 2.5.8求助
解决M3 Mac Sonoma下安装nio4r 2.5.8失败的问题
从报错日志看,核心问题是nio4r 2.5.8的C扩展代码在ARM架构的Sonoma系统中,与Ruby 3.0.2的函数签名不兼容,具体是selector.c里传递给rb_ensure的函数指针类型不匹配。以下是几种可行的解决方向:
1. 升级nio4r到兼容版本
旧版本nio4r未适配ARM Mac和Ruby 3.x特性,直接在Gemfile中指定更高版本覆盖Rails依赖:
# 放在rails依赖之前 gem 'nio4r', '>= 2.5.9' gem 'rails', '7.0.4.3'
执行:
bundle install
2. 跳过Action Cable(若无需使用)
如果项目用不到Action Cable,可直接排除它的安装:
- 新建Rails项目时:
rails new your_app --skip-action-cable - 已有项目修改Gemfile:
gem 'rails', '7.0.4.3', require: %w[rails/all].reject { |dep| dep == 'actioncable' }
之后执行bundle install,就不会触发nio4r的安装了。
3. 升级Ruby版本
Ruby 3.0.2对ARM Mac的支持不完善,用asdf升级到3.0.x系列最新版(如3.0.6):
asdf install ruby 3.0.6 asdf global ruby 3.0.6 gem install bundler bundle install
新版本Ruby修复了不少ARM架构下的编译兼容性问题,大概率能解决该错误。
4. 强制忽略编译类型错误
若必须保留当前Ruby和nio4r版本,可通过编译参数跳过类型不兼容错误:
# 配置bundle编译参数 bundle config build.nio4r --with-cflags="-Wno-incompatible-function-pointer-types" # 重新安装依赖 bundle install
或单独安装nio4r:
gem install nio4r -v '2.5.8' -- --with-cflags="-Wno-incompatible-function-pointer-types"
5. 替换Puma为Unicorn(可选)
如果不需要Puma作为服务器,可换成不依赖nio4r的Unicorn:
# Gemfile中替换 # gem 'puma' gem 'unicorn'
执行bundle install即可,但注意若保留Action Cable,仍需解决nio4r的问题,此方法仅解决Puma带来的依赖。
内容的提问来源于stack exchange,提问作者aec
相关产品推荐
相关产品推荐

