Bundler环境下Ruby Gem safe-eth-ruby自动加载异常求助
问题分析与解决方案
可能的原因
- Gemspec未配置自动加载入口:你的gem的
.gemspec文件里没指定自动加载的主文件,导致Bundler在启动irb时不会自动require你的gem。 - 主入口文件未加载子模块:即使gemspec配置了自动加载,如果
lib/safe_eth_ruby.rb没有引入Protocol模块,控制台里还是找不到这个常量。
具体修复步骤
1. 修正Gemspec配置
打开safe-eth-ruby.gemspec,补充或确认以下关键配置:
Gem::Specification.new do |spec| # ... 其他已有配置 ... # 指定gem的自动加载入口文件 spec.autorequire = "safe_eth_ruby" # 确保lib目录被设为require路径(默认就是["lib"],但要确认没被修改) spec.require_paths = ["lib"] # 确保包含lib下所有必要文件 spec.files = Dir["lib/**/*", "README.md", "LICENSE.txt"] end
2. 调整主入口文件的加载逻辑
编辑lib/safe_eth_ruby.rb,确保它加载了Protocol模块:
# lib/safe_eth_ruby.rb require "safe_eth_ruby/protocol" module SafeEthRuby # 你的gem核心逻辑 end
同时确认lib/safe_eth_ruby/protocol.rb的模块命名符合目录结构:
# lib/safe_eth_ruby/protocol.rb module SafeEthRuby module Protocol # 模块具体实现 end end
3. 验证修复效果
重新构建并安装gem:
gem build safe-eth-ruby.gemspec gem install ./safe-eth-ruby-<version>.gem
之后运行bundle exec irb,直接访问SafeEthRuby::Protocol就不会再触发未初始化常量的错误。
额外排查点
- 如果使用Ruby 2.5+默认的Zeitwerk自动加载器,必须保证目录结构和模块命名严格对应:
lib/safe_eth_ruby/protocol.rb对应SafeEthRuby::Protocol,否则自动加载会失效。 - 检查Gemfile中是否正确引用了gem,比如本地开发时用
gem "safe-eth-ruby", path: "./your-gem-path",并执行bundle install同步配置。
内容的提问来源于stack exchange,提问作者Bolo
相关产品推荐
相关产品推荐

