当我们运行bundle gem new_gem
命令时,会创建一个包含这些文件的目录:
create new_gem/Gemfile
create new_gem/Rakefile
create new_gem/.gitignore
create new_gem/new_gem.gemspec
create new_gem/lib/new_gem.rb
create new_gem/lib/new_gem/version.rb
默认情况下,文件new_gem/lib/new_gem.rb
是名为NewGem
的模块。
我的问题如下:如果NewGem
是一个班级怎么办?而不是NewGem::NewGem
,我想定义这个类(没有根模块)。
我试图在这个文件中逐个替换模块,然后创建一个本地gem来测试它,但是在安装之后,我无法在IRB中加载它(使用require 'new_gem'
)。
感谢您的帮助。
答案 0 :(得分:3)
你应该问问自己为什么要这样做。该模块用于namespace您宝石的代码。通常为内部的所有类提供上下文,但即使在单个类gem中,这也有助于提供与世界上其他代码的冲突。
除非你的班级被命名为SomethingThatCouldNeverPossiblyBeDefinedAnywhereElse
,否则保留该模块可能是一件好事。无论如何,保留模块完好无损仍然是一件好事,因为它是常规,也是人们在检查/使用代码时所期望的。
考虑到这一点,如果你想要一个单一的宝石,你需要做的一些事情。
生成的gemspec希望require 'new_gem/version'
找到它的版本号。将其更改为require 'new_gem'
。
gemspec还使用git ls
列出其包含的文件,生成的gem包已经包含在预构建的git仓库中new_gem/version
。删除它:
git rm lib/new_gem/version.rb
将您的new_gem
模块更改为班级,就像之前一样。
从您的班级中删除生成的version.rb
要求,然后在那里定义版本,例如:
class NewGem
VERSION = '0.0.1'
end
最后通过rake install
安装gem。在您完成此操作之前,您无法在IRB中加载它。