莊周夢蝶

          生活、程序、未來
             :: 首頁 ::  ::  :: 聚合  :: 管理

          創建自己的ruby Gems

          Posted on 2007-04-12 20:38 dennis 閱讀(2221) 評論(0)  編輯  收藏 所屬分類: 動態語言
              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
          ="http://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確實太簡陋了,哈哈。



          主站蜘蛛池模板: 西城区| 滨州市| 大厂| 临汾市| 广元市| 集贤县| 宜宾市| 安义县| 济源市| 延长县| 延川县| 兴安县| 盐亭县| 达孜县| 龙泉市| 松原市| 榆社县| 教育| 陇川县| 北流市| 宜黄县| 无为县| 花莲市| 行唐县| 乌苏市| 光山县| 英吉沙县| 乡城县| 象山县| 靖边县| 武义县| 巴塘县| 汾西县| 资溪县| 潼南县| 贵德县| 万荣县| 台州市| 京山县| 余江县| 高唐县|