2011-11-12 72 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

相關問題