日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

如何制作自己的gem

發(fā)布時(shí)間:2025/7/14 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何制作自己的gem 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

?Rails支持多種方式的擴(kuò)展,包括plugin,gem, 或者放到lib文件下等多種方式。 但是隨著bundler的出現(xiàn), Rails3時(shí)代我們還是寫gem比較好, 方便管理。

所以下面只介紹如何制作屬于自己的gem。開始之前先確保你機(jī)器了安裝了git。

在我們的項(xiàng)目里面, 我看到在config/initializers/下有一個(gè)hash.rb文件, 是使用了一個(gè)monkey patch的方式來對(duì)Hash進(jìn)行了一個(gè)擴(kuò)展:

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

像這種擴(kuò)展方式不是很好, 我想把它修改為一個(gè)gem, 如果以后有其他的擴(kuò)展,比如對(duì)Array,Hash等其他方法擴(kuò)展,我們可以升級(jí)gem,這樣就方便管理了,不至于那么混亂。

我們開始吧:
1. 安裝bundler, 因?yàn)槲乙胋undler來生成一個(gè)基礎(chǔ)gem結(jié)構(gòu)。

gem install bundler


2. 使用bundler來生成一個(gè)基礎(chǔ)gem結(jié)構(gòu):

bundle gem ruby_extendsions


命令執(zhí)行以后會(huì)看到生成下面這些文件:

create ruby_extendsions/Gemfilecreate ruby_extendsions/Rakefilecreate ruby_extendsions/.gitignorecreate ruby_extendsions/ruby_extendsions.gemspeccreate ruby_extendsions/lib/ruby_extendsions.rbcreate ruby_extendsions/lib/ruby_extendsions/version.rb Initializating git repo in /Users/alex/work/mygems/test/ruby_extendsions


說明一下:
1). ruby_extendsions.gemspec , 類似于這樣的.gemspec文件,就相當(dāng)于gem的說明書, 將來你打gem包的時(shí)候, 就靠這個(gè)文件了。
2). lib下放我們的代碼實(shí)現(xiàn)
3). 整個(gè)項(xiàng)目至于git版本控制下。方便我們push到rubygem.org.

3. 使用Rspec進(jìn)行TDD方式開發(fā)我們的代碼:
確保我們能用rspec, 在ruby_extendsions.gemspec里添加:

s.add_development_dependency "rspec"


然后,執(zhí)行:

bundle install


這下我們就可以使用rspec了。
在根目錄下增加一個(gè)spec文件夾, 考慮到我們要實(shí)現(xiàn)的功能, 是對(duì)ruby的一些擴(kuò)展, 所以我暫時(shí)就命名為了ruby_extendsions, 而此次只是針對(duì)Hash類的擴(kuò)展, 所以我們需要在spec目錄下建立一個(gè)測(cè)試文件hash_spec.rb和spec_helper.rb來測(cè)試我們對(duì)Hash擴(kuò)展功能是否正確:

#spec/hash_spec.rbrequire File.expand_path(File.dirname(__FILE__) + '/spec_helper')describe "RubyExtend::HashExtendsions" dobefore(:each) do@hash1 = {:a => 1, :b => 2}endit "A hash data should not be reversed if havn't use ruby_extend " do#當(dāng)沒有使用我們的擴(kuò)展的時(shí)候, Hash類是不應(yīng)該包含hash_reverse這個(gè)方法的, 這個(gè)測(cè)試也保證了我們?cè)跀U(kuò)展一個(gè)Ruby內(nèi)部類的時(shí)候不會(huì)和其內(nèi)部方法名沖突。@hash1.respond_to?("hash_reverse").should eql false endit "A hash data should be reversed" dorequire 'ruby_extendsions'@hash1.hash_reverse.should eql({1=>:a, 2=>:b} )end end


上面的代碼:spec_helper.rb文件為將來準(zhǔn)備,如果擴(kuò)展其他方法, 會(huì)用到一些公用的配置。
測(cè)試由一 個(gè)正例和一個(gè)反例組成。

4. 運(yùn)行測(cè)試:

bundle exec rspec spec

, bundle exec確保rspec是使用我們?cè)?gemspec文件里聲明的版本。
當(dāng)然,測(cè)試結(jié)果是會(huì)失敗,因?yàn)槲覀冞€沒有擴(kuò)展hash_reverse方法呢。

5. 實(shí)現(xiàn)代碼:
打開lib/ruby_extendsions.rb:

require 'ruby_extendsions/hash_extendsions' #我們今天要實(shí)現(xiàn)的Hash擴(kuò)展require 'ruby_extendsions/array_extendsions' #以后有可能用到對(duì)Array方法的擴(kuò)展,我們就放這個(gè)文件里。 然后在lib下建立hash_extendsions.rb文件:
module RubyExtendsions module HashExtendsions #注意模塊的命名要和文件名和路徑保持一致。def self.included(base) #hook, 當(dāng)這個(gè)module在被include的時(shí)候觸發(fā)base.send :include, InstanceMethods #引入實(shí)例方法base.send :extend, ClassMethods # 引入類方法endmodule InstanceMethodsdef hash_reverse #我們的hash_reverse是實(shí)例方法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#真正的擴(kuò)展 class Hashinclude RubyExtendsions::HashExtendsions end

上面的代碼都帶注釋了。
然后我們運(yùn)行測(cè)試, oK, 都通過了。大功告成了。

6. 發(fā)布我們的gem:
我們修改一下.gemspec文件, 把項(xiàng)目相關(guān)信息都寫里面去:

# -*- encoding: utf-8 -*-Gem::Specification.new do |s|s.name = "ruby_extendsions" s.version = "0.1" s.platform = Gem::Platform::RUBYs.authors = ["blackanger"]s.email = ["blackanger.z@gmail.com"]s.homepage = "http://rubygems.org/gems/ruby_extendsions" s.summary = "Ruby Extendsions For Hash" s.description = "Ruby Extendsions" s.required_rubygems_version = ">= 1.3.6" s.rubyforge_project = "ruby_extendsions" s.add_development_dependency "bundler", ">= 1.0.0" s.add_development_dependency "rspec" s.files = `git ls-files`.split("\n")s.executables = `git ls-files`.split("\n").map{|f| f =~ /^bin\/(.*)/ ? $1 : nil}.compacts.require_path = 'lib' end 然后, 我們?cè)诟夸浵聢?zhí)行命令:
rake install
這個(gè)命令會(huì)生成pkg/ruby_extendsions-0.1.gem. 到此為止,我們的gem包就打好了。 你可以把你的gem項(xiàng)目上傳到github。 但是github從去年開始就停止了自動(dòng)打包服務(wù)。所以你如果想使用gem install ruby_extendsions命令來安裝你的gem, 需要把它上傳到rubygems.org里。 首先,你需要在rubygems.org里注冊(cè)一個(gè)帳號(hào)。 其次, gem install gemcutter 然后你就push吧。 gem push ruby_extendsions-0.1.gem 如果碰到權(quán)限的錯(cuò)誤,那說明在rubygems里面已經(jīng)有了和你一樣名字的gem包,換個(gè)名字就oK了。

P.S 我的這個(gè)gem已經(jīng)上傳到了rubygems.org上面, 也上傳到了github. (完整代碼:http://github.com/ZhangHanDong/ruby_extend).

轉(zhuǎn)載于:https://blog.51cto.com/blackanger/411334

總結(jié)

以上是生活随笔為你收集整理的如何制作自己的gem的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。