博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
创建自己的ruby Gems
阅读量:7207 次
发布时间:2019-06-29

本文共 2880 字,大约阅读时间需要 9 分钟。

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

转载地址:http://pdvum.baihongyu.com/

你可能感兴趣的文章
[LeetCode] Search Insert Position 解题报告
查看>>
c# 的传递参数值传递与传递引用的区别,ref与out区别
查看>>
win7+vs2008+cuda5.x 环境配置二
查看>>
PHP5.5安装PHPRedis扩展
查看>>
c#Socket Tcp服务端编程
查看>>
java构造函数注意点
查看>>
Asp.net 中配置 CKEditor和CKFinder
查看>>
Use dynamic type in Entity Framework 4.1 SqlQuery() method
查看>>
《Python CookBook2》 第四章 Python技巧 - 若列表中某元素存在则返回之 && 在无须共享引用的条件下创建列表的列表...
查看>>
redhat网卡设置
查看>>
javascript 的作用域
查看>>
JFinal极速开发框架使用笔记(二) 两个问题,一个发现
查看>>
AutoCompleteTextView
查看>>
SecureCRT生成序列
查看>>
Android 应用程序主框架搭建
查看>>
2012腾讯春季实习生面试经历(二)
查看>>
用Bootstrap框架弹出iframe页面 在弹出的模态框中载人iframe页面,bootstrapiframe
查看>>
2012腾讯暑期实习面经(技术类web前端)
查看>>
第3种方法获取redis cluster主从关系
查看>>
注册表管理(本地、远程)
查看>>