2011-11-12 49 views
1

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

感谢您的帮助。

回答

3

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

除非您的课程名为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安装宝石。在完成此操作之前,您无法将其加载到IRB中。

+0

问题仍然存在。我认为唯一干净的方法就是将课程放在主模块中,正如你所解释的那样。谢谢。 –

+0

那么,它*应该*工作。当我回答时,我确实自己完成了这些步骤,并且我能够将没有任何问题的纯班级宝石加载到IRB中。但是,只要坚持模块命名空间可能是最好的路线。 – numbers1311407

相关问题