gem spec的说明文件已经建立起来了,它是作为一个ruby的可运行的文件,激活运行它就能生成gem文件了,MomLog-0.5.0.gem
| % ruby momlog.gemspec
Attempting to build gem spec 'momlog.gemspec' Successfully built RubyGem Name: MomLog Version: 0.5.0 File: MomLog0.5.0.gem |
另外一个创建的方法,是使用gem命令来生成:
| % gem build momlog.gemspec |
现在你已经有了gem文件了,你可以像其他包一样可以进行分发了。一旦有人获得这个gem文件,就可以安装它了。如果你想把它贡献给ruby社区,最简单的方式是使用RubyForge (http://rubyforge.org).这个站点会每天分几次进行gem打包。一切变得很容易,不需要人工干预。
通过rake来创建gem文件
rake使用一个叫做rakefile的命令文件来控制构建过程。它定义了一组规则(rules)和任务(tasks),它也是使用ruby的语法。
怎样使用rake,请参看:http://rake.rubyforge.org。这里我们只把注意力集中在如何构建gem文件上。从rake的网站上可以知道:
Tasks are the main unit of work in a Rakefile. Tasks have a name (usually given as a symbol or a string), a list of prerequisites (more symbols or strings), and a list of actions (given as a block).
tasks是rakefile中的最主要的工作单元。tasks有一个名字(通常是给定一个symbol或一个字符串),一个先决条件的列表(更多的symbols或字符串),和一个动作列表(给定的一个block)。
你可以在rakefile里使用rake内建的task方法定义你自己的方法,gem的创建就是一个特殊的方法,叫GemPackageTask。这个方法用在gem构建后的处理工作。举个例子:
| require 'rubygems'
Gem::manage_gems require 'rake/gempackagetask' spec = Gem::Specification.new do |s| s.name = "MomLog" s.version = "0.5.0" s.author = "Jo Programmer" s.email = "jo@joshost.com" s.homepage = "http://www.joshost.com/MomLog" s.platform = Gem::Platform::RUBY s.summary = "An online Diary for families" s.files = FileList["{bin,tests,lib,docs}/**/*"].exclude("rdoc").to_a s.require_path = "lib" s.autorequire = "momlog" s.test_file = "tests/ts_momlog.rb" s.has_rdoc = true s.extra_rdoc_files = ["README"] s.add_dependency("BlueCloth", ">= 0.0.4") s.add_dependency("MenuBuilder", ">= 1.0.0") end Rake::GemPackageTask.new(spec) do |pkg| pkg.need_tar = true end |
注意这里要加载rubygems,同时使用了FileList而不是Dir.glob,Filelist比Dir.glob使用起来更聪明些。自动过滤掉不使用到的文件。比如cvs目录下的一些cvs控制文件。
在内部,GemPackageTask会生成一个带有标识的rake目标。package_directory/gemnamegemversion.
gem。在放置rakefile的同一个目录下,运行rake
| % rake pkg/MomLog0.5.0.gem
(in /home/chad/download/gembook/code/MomLog) Successfully built RubyGem Name: MomLog Version: 0.5.0 File: MomLog0.5.0.gem |
