F's Blog

博客 收藏夹
如何发布一个Ruby Gem

29 Jun 2013

一个gem由三部分组成:

每一个gem都有如下的目录结构:

% tree freewill
freewill/
├── bin/
│   └── freewill
├── lib/
│   └── freewill.rb
├── test/
│   └── test_freewill.rb
├── README
├── Rakefile
└── freewill.gemspec

开发

看一个最简单的例子。

目录树:

├── fuhao-0.0.0.gem
├── fuhao.gemspec
└── lib
    └── fuhao.rb

fuhao.rb文件,功能代码:

class Fuhao
  def self.hi
    puts "Hello, I am Fu Hao!"
  end
end

fuhao.gemspec文件,代码见下:

Gem::Specification.new do |s|
  s.name        = 'fuhao'
  s.version     = '0.0.0'
  s.date        = '2013-06-29'
  s.summary     = "A simple hello world gem."
  s.description = "A simple hello world gem."
  s.authors     = ["Aston Fu"]
  s.email       = 'im@fuhao.im'
  s.files       = ["lib/fuhao.rb"]
  s.homepage    = 'http://rubygems.org/gems/fuhao'
end

有了上面的文件后,可以生成gem了:

gem build fuhao.gemspec

然后本地安装:

gem install ./fuhao-0.0.0.gem

安装成功后,进入irb测试:

> require 'fuhao'
 => true
> Fuhao.hi
Hello, I am Fu Hao!
 => nil

发布

OK,有了上面的.gem文件就可以发布到rubygems.org了。

首选需要注册帐号:

curl -u username https://rubygems.org/api/v1/api_key.yaml > ~/.gem/credentials

输入密码,就可以push了

gem push fuhao-0.0.0.gem

push成功后,就可以看到了,https://rubygems.org/gems/fuhao,等会儿就可以用gem install fuhao来安装了,等它同步到国内镜像有需要段时间。

简单的方法最后说 :)

使用bundler:

bundle gem my_gem

思考

为什么一般都会在 lib 目录里创建一个文件,然后从这个文件里引用自己的文件呢?

因为 Ruby 会把 lib 文件里的所以文件加载到其 $LOAD_PATH 里,使用一个总领文件,相当于加了一个作用域,这样便不会和其它 gem 的冲突了。

参考:

本文由 付豪 创作,采用署名 4.0 国际(CC BY 4.0)创作共享协议进行许可,详细声明