来自班级的Bundler的新宝石

时间:2011-11-12 10:53:43

标签: ruby bundler

当我们运行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')。

感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

你应该问问自己为什么要这样做。该模块用于namespace您宝石的代码。通常为内部的所有类提供上下文,但即使在单个类gem中,这也有助于提供与世界上其他代码的冲突。

除非你的班级被命名为SomethingThatCouldNeverPossiblyBeDefinedAnywhereElse,否则保留该模块可能是一件好事。无论如何,保留模块完好无损仍然是一件好事,因为它是常规,也是人们在检查/使用代码时所期望的。

考虑到这一点,如果你想要一个单一的宝石,你需要做的一些事情。

  1. 生成的gemspec希望require 'new_gem/version'找到它的版本号。将其更改为require 'new_gem'

  2. gemspec还使用git ls列出其包含的文件,生成的gem包已经包含在预构建的git仓库中new_gem/version。删除它:

    git rm lib/new_gem/version.rb
    
  3. 将您的new_gem模块更改为班级,就像之前一样。

  4. 从您的班级中删除生成的version.rb要求,然后在那里定义版本,例如:

    class NewGem
      VERSION = '0.0.1'
    end 
    
  5. 最后通过rake install安装gem。在您完成此操作之前,您无法在IRB中加载它。