开发Ruby Gem时新增功能打包及maker Gem加载报错求助
一、先搞定require 'maker'的报错问题
你说在irb里执行require 'maker'报错,但gem安装目录里明明有user.rb,大概率是Gem的文件结构或者gemspec配置没做好,导致Bundler没把user.rb正确加载进来。我给你一步步排查:
核对Gem目录结构
规范的Gem结构应该是这样的:maker/ lib/ maker.rb # 主入口文件 maker/ user.rb # 用户功能文件 maker.gemspec如果你的user.rb直接放在lib根目录,或者没放在
lib/maker子目录下,很容易出现加载问题;另外主入口文件如果没主动加载user.rb,irb也找不到它。检查主入口
lib/maker.rb
必须在主文件里显式加载你的user.rb,比如添加一行:require 'maker/user'要是你的user.rb在lib根目录,就写
require 'user',但更推荐放在子目录里,避免和其他Gem的文件重名冲突。确认gemspec配置
确保gemspec里正确指定了要包含的文件,比如:spec.files = Dir["lib/**/*", "README.md", "LICENSE.txt"]这行通配符会把lib下所有文件都打包进Gem,虽然你说安装目录里有user.rb,但还是确认下这步避免遗漏。
重新安装本地Gem
改完配置后,在Gem根目录执行:bundle install # 或者直接本地构建安装 gem build maker.gemspec gem install maker-0.1.0.gem再去irb里试
require 'maker',应该就能正常加载user.rb了。
二、开发新Gem时添加&打包新功能的标准流程
按照Bundler的规范,我给你整理一套实用步骤:
第一步:新增功能代码
比如你要做用户功能,按规范创建文件(比如lib/maker/user.rb),在里面实现功能:module Maker class User def self.greet(name) "Hello, #{name}!" end end end第二步:在主入口加载新代码
刚才提到的,在lib/maker.rb里添加require 'maker/user',这样用户只需要require 'maker'就能自动加载所有子功能。第三步:更新gemspec(按需)
如果新增了依赖、改了版本号或者新增了非lib目录的文件(比如更新了README),就要同步修改gemspec:- 版本号:把
spec.version = "0.1.0"改成"0.1.1"(小版本迭代) - 新增依赖:
spec.add_dependency "some_gem", "~> 1.0" - 文件包含:确保
spec.files的通配符能覆盖新增文件,用Dir["lib/**/*", "README.md", ...]基本不会漏。
- 版本号:把
第四步:测试新功能
可以用bundle console代替irb,它会自动加载你的Gem环境,不用手动require,能快速测试代码;也可以写单元测试(比如RSpec),确保功能稳定:bundle exec rspec第五步:提交代码&打版本标签
把代码提交到Git,别忘了打版本标签(和gemspec版本一致):git add . git commit -m "Add user functionality" git tag v0.1.1 git push && git push --tags第六步:打包&发布(按需)
如果要发布到Rubygems,先确保有账号,然后执行:gem build maker.gemspec gem push maker-0.1.1.gem要是只在本地用,直接
gem install maker-0.1.1.gem就搞定了。
内容的提问来源于stack exchange,提问作者boddhisattva

