创建自己的ruby Gems

    xiaoxiao2024-05-11  118

    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确实太简陋了,哈哈。

    文章转自庄周梦蝶  ,原文发布时间5.17

    相关资源:敏捷开发V1.0.pptx
    最新回复(0)