閱讀247 返回首頁    go 阿裏雲 go 技術社區[雲棲]


創建自己的ruby Gems

RubyGems是一個庫和程序的標準化打包以及安裝框架,它使定位、安裝、升級和卸載Ruby包變的很容易。rails以及它的大部分插件都是以gem形式發布的。本文描述一個自己創建ruby Gems的過程。
    假設你今天用ruby實現了一個stack結構,你想發布到網上讓別人可以共享,OK,工作開始了。首先你的程序當然要先寫好了:
#stacklike.rb
module Stacklike
 attr_reader:stack
 
def initialize
    @stack
=Array.new
 end
 
def add_to_stack(obj)
    @stack.push(obj)
 end 
 
def take_from_stack
    @stack.pop
 end
 
def size
    @stack.length
 end
 alias length size
 
 
def clear
   @stack.clear
 end
end      

然後就是我們的Stack類,引入這個Module,請注意,我們這裏隻是特意這樣做,增加點複雜度:
#stack.rb
require 
'stacklike'
class Stack
 include Stacklike
end

 

作為一個要被大眾使用的小程序,一定要有完備的測試代碼,OK,ruby內置了單元測試庫,我們來寫個單元測試來測試Stack:
require 'stack'
require 
'test/unit'
class TestStack <Test::Unit::TestCase
  
def testStack
    stack
=Stack.new
    assert_equal(0,stack.size)
    assert_equal(stack.length,stack.size) 
    stack.add_to_stack(
1)
    assert_equal(
1,stack.length)
    assert_equal(
1,stack.take_from_stack)
    
    stack.clear
    assert_equal(0,stack.length)
    assert_nil(stack.take_from_stack)
    
    
10.times{|i| stack.add_to_stack(i)}
    assert_equal(
10,stack.size)
    assert_equal(stack.length,stack.size)
    
9.downto(4){|i| assert_equal(i,stack.take_from_stack)} 
    
    assert_equal(
4,stack.length)
    assert_equal(
3,stack.take_from_stack)
    assert_equal(
3,stack.length)
    
    stack.clear
    assert_equal(0,stack.length)
    assert_nil(stack.take_from_stack)
  end
end

如果你使用radrails或者RDT運行這段代碼,你將看到讓人舒服的greenbar,一切正常。程序寫好了,接下來就是關鍵步驟了,怎麼發布成ruby Gems呢?

第一步,寫Gems規範文件
   gemspec是ruby或者YAML形式的元數據集,用來提供這個gem的關鍵信息,我們創建一個文件夾就叫stack,然後在下麵建立2個目錄兩個文件:
lib目錄:用於存放庫的源代碼,比如這個例子中的stack.rb,stacklike.rb
test目錄:用於存放單元測試代碼。
README文件:描述你的庫的基本信息和版權許可證等
stack.gemspec:gems規範文件,用以生成gem
當然,也可以有docs目錄用以存放rdoc文檔和ext目錄用以存放ruby擴展,我們這個簡單例子就免了。
看看我們的規範文件:
#stack.spec
require 
'rubygems'
SPEC
=Gem::Specification.new do |s|
  s.name
="Stack"
  s.version
='0.01'
  s.author
='dennis zane'
  s.email
="killme2008@gmail.com"
  s.homepage
="https://www.rubyeye.net"
  s.platform
=Gem::Platform::RUBY
  s.summary
="ruby實現的Stack"
  condidates 
=Dir.glob("{bin,lib,docs,test}/**/*")
  s.files
=condidates.delete_if do |item|
    item.include?(
"CVS")|| item.include?("rdoc")
  end
  s.require_path
="lib"
  s.autorequire
='stack,stacklike'
  s.test_file
="test/ts_stack.rb"
  s.has_rdoc
=false
  s.extra_rdoc_files
=["README"]
end  

很明顯,規範文件也是ruby程序(也可以用YAML描述),設置了這個gem的主要關鍵信息:名稱、作者信息、平台,需要注意的就是files數組過濾掉了cvs和rdoc文件,require_path和auto_require讓你指定了require_gem裝入gem時會被添加到$LOAS_PATH(ruby查找庫的路徑)中的目錄(也就是我們源代碼存放的lib),auto_require指定了裝載的文件名,我們沒有rdoc,所有設置has_rdoc為false,附帶文檔就是README。

第二步 修改單元測試文件引用路徑
過去我們假設ts_stack.rb與stack.rb、stacklike.rb在同一個目錄下,可是我們現在將它們分別放在lib和test目錄,TestStack 怎麼引用測試的類呢?答案是在ts_stack.rb開頭加上一行:
$:.unshift File.join(File.dirname(__FILE__),"..","lib")

最後一步 構建gem
在stack目錄執行下列命令:
ruby stack.gemspec
 
或者:
gem build stack.gemspec
將生成一個文件,你可以將這個文件共享給朋友們咯。你的朋友隻要下載這個文件,執行:
gem install Stack.0.01.gem

將在他們的ruby環境中安裝你寫的stack,比較遺憾的是,你這個stack確實太簡陋了,哈哈。

文章轉自莊周夢蝶  ,原文發布時間5.17

最後更新:2017-05-17 13:35:15

  上一篇:go  半年的讀書計劃有保證了
  下一篇:go  org.springframework.core.enums類圖