Ruby 2.7.6下ox 2.10.0无法加载C扩展的解决问询
解决ox 2.10.0在Ruby 2.7.6下的C扩展加载问题
针对你执行bundle exec rails assets:precompile时遇到的LoadError: cannot load such file -- ox/ox错误,以下是几个无需升级ox或Ruby版本的规避方案:
方案一:手动修补ox源码并固化修改
- 执行
bundle show ox获取项目中ox gem的安装路径 - 打开该路径下的
lib/ox.rb,定位到第79行,将原有的require 'ox/ox'改为require_relative 'ox/ox'(对应PR的修复逻辑) - 修改后保存,重新运行资产预编译命令
- 为避免后续
bundle install覆盖修改,使用bundler的patch功能固化:- 将修改内容生成.patch文件,放在项目目录下(如
patches/ox_2.10.0_fix.patch) - 在Gemfile中调整ox的引用:
gem 'ox', '2.10.0', patch: 'patches/ox_2.10.0_fix.patch' - 执行
bundle install使patch生效
- 将修改内容生成.patch文件,放在项目目录下(如
方案二:强制使用ox的纯Ruby版本
- 执行
bundle config build.ox --disable-extensions,配置bundler安装ox时跳过C扩展编译 - 重新执行
bundle install,此时ox会切换为纯Ruby实现 - 注意:纯Ruby版本性能低于C扩展,但仅用于资产预编译场景通常可接受
方案三:临时替换加载逻辑
- 在项目
config/initializers目录下创建ox_fix.rb文件,添加以下代码(确保在ox加载前执行):unless defined?(Ox) ox_gem_path = Gem.loaded_specs['ox'].full_gem_path extension_path = File.join(ox_gem_path, 'lib', 'ox', 'ox') # 加载编译后的扩展文件(系统不同后缀可能为.so或.bundle) require extension_path # 加载ox主文件 require File.join(ox_gem_path, 'lib', 'ox') end - 保存后重新运行资产预编译命令
内容的提问来源于stack exchange,提问作者r351574nc3
相关产品推荐
相关产品推荐

