对于初学者来说,可能经常会使用gem命令来安装一些Ruby软件包,但是随着能力的提升,你可能不再满足于仅仅编写教科书上的示例程序,你开始尝试编写一些有实际用途的程序,并且你觉得这些程序可能会对其它人有用,这时候你就需要将你的程序打包并发布给其他人,Ruby自带的包管理软件gem可以很好的帮你完成这个任务,本篇指南将通过一个简单的“Hello, gem!”程序来演示如何制作自己的GEM程序包。
首先假设我们的程序目录结构如下:
gem-sample/
bin/
gem-sample
lib/
gem-sample.rb
spec/
gem-sample-spec.rb
README
CHANGES
Rakefile
我们的sample程序很简单,它只是简单的打印一句话:
module GemSample
def GemSample.run
puts "Hello, gem!"
end
end
可执行程序实际上也是一个ruby脚本:
$LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__) + "/../lib"))
require "gem-sample"
GemSample.run
它读取lib文件夹下的gem-smaple.rb文件,然后调用它的run方法。
现在我们要将这个程序打包成一个gem文件,gempackagetask让我们可以通过Rake来完成打包工作,我们可以这样定义我们的Rakefile:
require 'rubygems'
require 'rake/gempackagetask'
PKG_NAME = "gem-sample"
PKG_VERSION = "1.0.0"
PKG_FILE_NAME = "#{PKG_NAME}-#{PKG_VERSION}"
PKG_FILES = FileList[
'[A-Z]*',
'lib/**/*.rb',
'spec/**/*.rb',
'bin/**/*',
]
spec = Gem::Specification.new do |s|
s.platform = Gem::Platform::RUBY
s.summary = "Just a sample gem."
s.name = PKG_NAME
s.version = PKG_VERSION
s.requirements << 'none'
s.require_path = 'lib'
s.autorequire = 'gem-sample'
s.executables = ['gem-sample']
s.default_executable = 'gem-sample'
s.author = ["sample team"]
s.email = "sample_team@sample.com"
s.files = PKG_FILES
s.description = <<-EOF
Just a gem sample.
EOF
end
Rake::GemPackageTask.new(spec) do |pkg|
pkg.need_zip = true
pkg.need_tar = true
end
生成gem文件的关键是spec结构,通过它可以控制gem文件的各个属性,大部分属性的含义都可以通过名字来理解,这里就不解释了。
现在我们运行rake -T就可以看到:
rake clobber_package # Remove package products
rake gem # Build the gem file gem-sample-1.0.0.gem
rake package # Build all the packages
rake repackage # Force a rebuild of the package files
执行rake gem,我们会看到根目录下多了一个pkg文件,其中已经包含了我们要发布的gem-sample-1.0.0.gem文件,现在执行:
$ cd pkg
$ gem install --local gem-sample
Successfully installed gem-sample, version 1.0.0
可以看到,我们的gem-sample已经成功安装了,如果你想知道我们到底安装了些什么文件,那么你可以到Ruby的安装目录去看看:
$RUBY_HOME/
bin/
gem-sample
gem-sample.cmd (win32平台)
lib/
ruby/
gems/
1.8/
gems/
gem-sampe-1.0.0/ (我们的文件就在这里了)
你也可以看看gem帮我们生成的两个文件(即bin下的两个文件)到底有些什么东西,实际上很简单。
现在我们可以试着执行我们的程序了,我们可以通过命令行,也可以通过在代码中包含:
$ gem-sample
Hello, Gem!
$ irb
> require “gem-sample”
=> true
> GemSample.run
Hello, Gem!
=> nil
很简单,不是吗?如果你认为你的程序确实很有用,并且你希望它被更多的人知道并使用,那么你可以考虑将你的gem发布到rubyforge(Ruby程序库的大本营)。
最后,如果你不想这个没什么用的垃圾gem占用你的磁盘空间,那么你可以通过下面这条命令来卸载它:
$ gem uninstall gem-sample
Successfully uninstalled gem-sample version 1.0.0