创建自己的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="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

时间: 2024-08-23 19:27:49

创建自己的ruby Gems的相关文章

创建自定义的Ruby gem包的教程_ruby专题

编写一个最简单的例子 1. 建好如下文件夹 注意:lib目录下必须有个和你gem名字一样的rb文件. 复制代码 代码如下:     $ cd hola      $ tree      .      ├── hola.gemspec      └── lib          └── hola.rb  2. 编写代码 . hola.rb % cat lib/hola.rb class Hola def self.hi puts "Hello world!" end end .hola.

Ruby Gems更换淘宝源方法_ruby专题

最近由于要做课设,所以昨天装了个 Windows,感觉闲的没事干,就想装个 Ruby 玩玩. 官方的 Rubygems 源由于有些资源放在 Amazon S3 上面,所以有时会抽风,在 Linux 下我用 proxychains gem install xxx 实现了指定程序实行 Shadowsocks 代理,但是 Windows 下不方便全局代理,所以就考虑换国内的淘宝源了. 之前换过一两次,但是由于只是两行命令而又不经常使用,所以就忘了,这次把它记录下来. 复制代码 代码如下: # 删除默认

Ruby on rails开发从头来(windows)(七)-创建在线购物页面

在上一篇随笔中,我们为Products创建了一个维护用的列表页面,效果如图: 开发从头来(windows)(七)-创建在线购物页面-ruby on rails"> 这次我们使用上面维护的Products列表来创建一个最终用户使用的购物页面. 1.创建控制器(Controller),命名为store,我们通过命令行来创建它: depot> ruby script/generate controller Store index 打开...rails_apps\depot\app\cont

Ruby程序中创建和解析XML文件的方法_ruby专题

使用builder创建XML builder安装方法: gem install builder require 'builder' x = Builder::XmlMarkup.new(:target => $stdout, :indent => 1) #":target =>$stdout"参数:指示输出内 容将被写向标准输出控制台 #":indent =>1"参数:XML输出形式将被缩 进一个空格字符x.instruct! :xml, :

使用XForms和Ruby on Rails开发小型门诊管理系统,第4部分

实现医生和患者搜索XForms 简介 到目前为止,我们已经创建了帮助患者和护士管理患者数据的 DB2 数据库和三个 XForms .通过使用 Ruby on Rails 作为处理接口,患者可以向数据库添加新的记录,并在以后更新信息.因此 护士可以查看并适当地修改这些信息,当患者可以诊治的时候批准输入的数据. 这是本系列的最 后一部分,将为医生创建新的视图和控制器以及该视图的两个新表单.医生通过第一个表单可以查看由患 者输入并经过护士批准的患者记录,并增加诊治过程中的新信息.然后开发一个表单让医生

使用XForms和Ruby on Rails开发小型门诊管理系统,第3部分

实现护士和医生XForm 本系列文章 介绍如何结合使用 XForms.IBM DB2 pureXML 和 Ruby 来简化 Web 应用程序的开发,分为四部分,这是第三部分.本系列文章中将开发一个虚构的应用程序来管理医生办公 室中的患者信息.您将看到每种技术的强大功能,同时还将看到如何将其结合起来.第 3 部分将开发护 士用的表单来编辑患者数据,学习如何用 Ruby 实现这样的功能. 简介 本系列文章的第 1 部分设计了一个 Web 应用程序,让患者在医生办公室里输入信息.讨论了如何使用 XFo

使用XForms和Ruby on Rails开发小型门诊管理系统,第2部分

实现患者信息XForm 简介 本系列文章的第 1 部分设计了一个 Web 应用程序,让患者在医生办公室中输入信息.讨论了如何使用 XForms.DB2 pureXML 和 Ruby on Rails 创建这样的应用程序,并对这些技术的用法做了一些实验.本文是第 2 部分,我们开始实现该应用程序.我们将设计第一个 XForm,并建立从表单向 DB2 插入数据的 Ruby on Rails 后端.您将看到如何通过这三种技术在整个应用程序中利用 XML. 先决条件 本文假设读者对 XML 和 Web

iOS 9 导入类库全面详尽过程(Ruby安装-&amp;gt;CocoaPods安装-&amp;gt;导入类库)

iOS 9 导入类库全面详尽过程(Ruby安装->CocoaPods安装->导入类库) 由于IT行业的飞速发展,各类工具,软件更新速度都太快了,在网上找的攻略可能都已经不实用了,对于一个新手来说从一片空白到成功地用CocoaPods导入类库需要浏览大量博文,所以在这里我就把全过程整合了一下,并把我个人的安装过程和遇到的一些问题分享一下(以AFNetworking),希望本文能帮助新手只用看这一篇博文就顺利完成整个过程. 引用博文 如何在Mac OS X上安装 Ruby运行环境 CocoaPod

Windows下Ruby on Rails开发环境安装配置图文教程_ruby专题

本文详细介绍如何在Windows配置Ruby on Rails 开发环境,希望对ROR初学者能有帮助. 一.下载并安装Ruby Windows下安装Ruby最好选择 RubyInstaller(一键安装包). 下载地址: http://rubyforge.org/frs/?group_id=167 . 我们这里下载目前较新的rubyinstaller-1.9.3-p0.exe 一键安装包.这个安装包除了包含ruby本身,还有许多有用的扩展(比如gems)和 帮助文档. 双击安装,安装过程出现如下