浏览 9430 次
锁定老帖子 主题:创建自己的ruby Gems
该帖已经被评为良好帖
|
|
---|---|
作者 | 正文 |
发表时间:2007-04-12
假设你今天用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确实太简陋了,哈哈。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-07-14
你好,我在windows下如何指定安装的目录呢,设定
GEM_HOME后运行出错,不知该如何解决? |
|
返回顶楼 | |
发表时间:2007-07-14
gem自动安装到${RUBY_HOME}/gem目录下
|
|
返回顶楼 | |