Back

建立一个rubygem ( how to create a ruby gem)

发布时间: 2013-01-25 09:42:00

参考:  http://guides.rubygems.org/make-your-own-gem

1. 假设你的gem名字是 "hola", 就要先建立这样的目录结构。(记得 lib下要有个跟项目同名的rb文件哦)

% tree
.
├── hola.gemspec
└── lib
    └── hola.rb

2. 编辑 lib/hola.rb 这个文件,让它看起来如下:

class Hola
  def self.hi
    puts "Hello world!"
  end
end

3. 编辑 hola.gemspec ,

% cat hola.gemspec
Gem::Specification.new do |s|
  s.name        = 'hola'
  s.version     = '0.0.0'
  s.date        = '2010-04-28'
  s.summary     = "Hola!"
  s.description = "A simple hello world gem"
  s.authors     = ["Nick Quaranto"]
  s.email       = '[email protected]'
  s.files       = ["lib/hola.rb"]
  s.homepage    =
    'http://rubygems.org/gems/hola'
end

4. 建立这个gem ,并且在本地安装它

% gem build hola.gemspec
Successfully built RubyGem
Name: hola
Version: 0.0.0
File: hola-0.0.0.gem

% gem install ./hola-0.0.0.gem
Successfully installed hola-0.0.0
1 gem installed

5. 试试这个gem ...

% irb
>> require 'hola'
=> true
>> Hola.hi
Hello world!

6. 在 rubygems.org 上注册并且登录,进入到profile 界面,就会发现

API Access
Your API key is 6cd7fafaeb3b7f721da09686f9668???.
If you want to use gem commands from the command line, you'll need a ~/.gem/credentials file, which you can generate using the following command:
$ curl -u Siwei Shen https://rubygems.org/api/v1/api_key.yaml > ~/.gem/credentials

7. push this gem to rubygems.org

% gem push hola-0.0.0.gem
Pushing gem to RubyGems.org...
Successfully registered gem: hola (0.0.0)

8 . 来个稍微复杂点儿的文件结构:

.
├── hola.gemspec
└── lib
    ├── hola
    │   └── translator.rb
    └── hola.rb

% cat lib/hola/translator.rb
class Hola::Translator
  def initialize(language)
    @language = language
  end

  def hi
    case @language
    when :spanish
      "hola mundo"
    else
      "hello world"
    end
  end
end

% cat lib/hola.rb
class Hola
  def self.hi(language = :english)
    translator = Translator.new(language)
    translator.hi
  end
end

require 'hola/translator'

然后在irb中试一下:

% irb -Ilib -rhola
irb(main):001:0> Hola.hi(:english)
=> "hello world"
irb(main):002:0> Hola.hi(:spanish)
=> "hola mundo"

Back