如何制作自己的gem
?Rails支持多種方式的擴展,包括plugin,gem, 或者放到lib文件下等多種方式。 但是隨著bundler的出現, Rails3時代我們還是寫gem比較好, 方便管理。
所以下面只介紹如何制作屬于自己的gem。開始之前先確保你機器了安裝了git。
在我們的項目里面, 我看到在config/initializers/下有一個hash.rb文件, 是使用了一個monkey patch的方式來對Hash進行了一個擴展:
class Hashdef # my_reversehash_new = Hash.newself.each {|key,value|if not hash_new.has_key?(key) then hash_new[value] = key end}return hash_newendend像這種擴展方式不是很好, 我想把它修改為一個gem, 如果以后有其他的擴展,比如對Array,Hash等其他方法擴展,我們可以升級gem,這樣就方便管理了,不至于那么混亂。
我們開始吧:
1. 安裝bundler, 因為我要用bundler來生成一個基礎gem結構。
2. 使用bundler來生成一個基礎gem結構:
命令執行以后會看到生成下面這些文件:
說明一下:
1). ruby_extendsions.gemspec , 類似于這樣的.gemspec文件,就相當于gem的說明書, 將來你打gem包的時候, 就靠這個文件了。
2). lib下放我們的代碼實現
3). 整個項目至于git版本控制下。方便我們push到rubygem.org.
3. 使用Rspec進行TDD方式開發我們的代碼:
確保我們能用rspec, 在ruby_extendsions.gemspec里添加:
然后,執行:
這下我們就可以使用rspec了。
在根目錄下增加一個spec文件夾, 考慮到我們要實現的功能, 是對ruby的一些擴展, 所以我暫時就命名為了ruby_extendsions, 而此次只是針對Hash類的擴展, 所以我們需要在spec目錄下建立一個測試文件hash_spec.rb和spec_helper.rb來測試我們對Hash擴展功能是否正確:
上面的代碼:spec_helper.rb文件為將來準備,如果擴展其他方法, 會用到一些公用的配置。
測試由一 個正例和一個反例組成。
4. 運行測試:
bundle exec rspec spec, bundle exec確保rspec是使用我們在.gemspec文件里聲明的版本。
當然,測試結果是會失敗,因為我們還沒有擴展hash_reverse方法呢。
5. 實現代碼:
打開lib/ruby_extendsions.rb:
module RubyExtendsions module HashExtendsions #注意模塊的命名要和文件名和路徑保持一致。def self.included(base) #hook, 當這個module在被include的時候觸發base.send :include, InstanceMethods #引入實例方法base.send :extend, ClassMethods # 引入類方法endmodule InstanceMethodsdef hash_reverse #我們的hash_reverse是實例方法hash_new = {}self.each {|key,value|if not hash_new.has_key?(key) then hash_new[value] = key end}return hash_newendend#InstanceMethodsmodule ClassMethods#TODOend#ClassMethodsend #HashExtendsions end #RubyExtendsions#真正的擴展 class Hashinclude RubyExtendsions::HashExtendsions end
上面的代碼都帶注釋了。
然后我們運行測試, oK, 都通過了。大功告成了。
6. 發布我們的gem:
我們修改一下.gemspec文件, 把項目相關信息都寫里面去:
rake install
這個命令會生成pkg/ruby_extendsions-0.1.gem. 到此為止,我們的gem包就打好了。 你可以把你的gem項目上傳到github。 但是github從去年開始就停止了自動打包服務。所以你如果想使用gem install ruby_extendsions命令來安裝你的gem, 需要把它上傳到rubygems.org里。 首先,你需要在rubygems.org里注冊一個帳號。 其次, gem install gemcutter 然后你就push吧。 gem push ruby_extendsions-0.1.gem 如果碰到權限的錯誤,那說明在rubygems里面已經有了和你一樣名字的gem包,換個名字就oK了。
P.S 我的這個gem已經上傳到了rubygems.org上面, 也上傳到了github. (完整代碼:http://github.com/ZhangHanDong/ruby_extend).
轉載于:https://blog.51cto.com/blackanger/411334
總結
以上是生活随笔為你收集整理的如何制作自己的gem的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle时间格式要注意的问题
- 下一篇: 我在北京大学,剑桥大学读的书