当我们运行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'
)。谢谢你的帮助。
最佳答案
你应该问问自己为什么要这样做这个模块是用来namespace你的gem代码的通常为内部的所有类提供上下文,但即使在单个类gem中,这也有助于提供与世界上其他代码的冲突。
除非您的类命名为SomethingThatCouldNeverPossiblyBeDefinedAnywhereElse
,否则保留该模块可能是一件好事。不管怎样,保持模块完好无损仍然是件好事,因为这是惯例,也是人们在检查/使用代码时的期望。
考虑到这一点,如果你想要一个类gem,你需要做一些事情。
生成的gempec希望require 'new_gem/version'
找到它的版本号将其更改为简单的require 'new_gem'
。
gempec还使用git ls
列出其包含的文件,并且生成的gem包已经包含在预构建的git repo中删除此:
git rm lib/new_gem/version.rb
如前所述,将
new_gem/version
模块更改为类。从类中移除生成的
new_gem
require,并在其中定义版本,例如:class NewGem
VERSION = '0.0.1'
end
最后通过
version.rb
安装gem在完成这项工作之前,您将无法将其加载到IRB中。