当我们运行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_gemrequire,并在其中定义版本,例如:
class NewGem
  VERSION = '0.0.1'
end

最后通过version.rb安装gem在完成这项工作之前,您将无法将其加载到IRB中。

10-05 18:17