岩本隆史の日記帳(アーカイブ)

はてなダイアリーのサービス終了をうけて移行したものです。更新はしません。

gemを初めて作った

Rubyでオレオレフレームワークを作ろうと思ってから、はや数か月。非同期処理やらRESTやら認証方式やらについて悩みはじめて、すっかり手が止まっていたのですが、悩んだおかげで方向性がだいぶ固まりました。手を動かすターンが再びやってまいりました。

せっかくフレームワークを作るのならオープンソースにしよう(俺しか使わないだろうけどな!)、配布形式はやっぱりgemだろう、ということで、gemの習作を作ってみることにしました。こんばんは、ジェム野周作です。

まずは作り方を調べるところから

概要をつかむのに「るびま」が参考になりました。要するに、gemspecファイルを作って「gem build」すればOKということですね。

この辺の作業を簡単にするために、下記のようなライブラリがあるようです。

が、今回は勉強のため、これらのライブラリは使わないことにしました。

ライブラリを作る

作り方はざっくりとつかめたので、ライブラリ本体を書きましょう。まずはディレクトリを作ります。

$ mkdir -p test_calculator/lib
$ cd test_calculator

ライブラリの中身に力を入れるつもりはないので、数値を2つ受け取って足し算して返すだけのクラスにします。

lib/test_calculator.rb
class TestCalculator
  def add(a, b)
    a + b
  end
end

数値じゃなかったらどうするの、とか言わないの〜。

gemspecファイルを書く

これも細かいところは後で勉強することにして、ざっくり書いてみます。

test_calculator-0.0.1.gemspec
Gem::Specification.new do |s|
  s.platform = Gem::Platform::RUBY
  s.name = "test_calculator"
  s.version = "0.0.1"
  s.summary = "Test calculator"
  s.author = "IWAMOTO Takashi"
  s.email = "hello@iwamot.com"
  s.homepage = "http://iwamot.com/"
  s.require_paths = ["lib"]
  s.files = Dir.glob("lib/**/*")
end

いよいよビルド

$ gem build test_calculator-0.0.1.gemspec
WARNING:  no rubyforge_project specified
WARNING:  RDoc will not be generated (has_rdoc == false)
  Successfully built RubyGem
  Name: test_calculator
  Version: 0.0.1
  File: test_calculator-0.0.1.gem

警告は出ていますが、今の段階では気にする必要はないですね。gemファイルが無事できました。

$ tree
.
|-- lib
|   `-- test_calculator.rb
|-- test_calculator-0.0.1.gem
`-- test_calculator-0.0.1.gemspec

そしてインストール

$ sudo gem install test_calculator
Successfully installed test_calculator-0.0.1
1 gem installed

問題ないですね。gemコマンドで確認してみます。

$ gem which test_calculator
(checking gem test_calculator-0.0.1 for test_calculator)
/usr/lib/ruby/gems/1.8/gems/test_calculator-0.0.1/lib/test_calculator.rb
$ gem contents test_calculator
/usr/lib/ruby/gems/1.8/gems/test_calculator-0.0.1/lib/test_calculator.rb

いい感じです。

最後に動作確認

$ irb -r rubygems -r test_calculator
irb(main):001:0> TestCalculator.new.add 3, 5
=> 8

おお、問題なく使えてます。やったね☆