gemを初めて作った
Rubyでオレオレフレームワークを作ろうと思ってから、はや数か月。非同期処理やらRESTやら認証方式やらについて悩みはじめて、すっかり手が止まっていたのですが、悩んだおかげで方向性がだいぶ固まりました。手を動かすターンが再びやってまいりました。
せっかくフレームワークを作るのならオープンソースにしよう(俺しか使わないだろうけどな!)、配布形式はやっぱりgemだろう、ということで、gemの習作を作ってみることにしました。こんばんは、ジェム野周作です。
まずは作り方を調べるところから
概要をつかむのに「るびま」が参考になりました。要するに、gemspecファイルを作って「gem build」すればOKということですね。
この辺の作業を簡単にするために、下記のようなライブラリがあるようです。
- newgem(参考:「RubyGems パッケージの作り方 - rubyforge 登録まで - 川o・-・)<2nd life」)
- gemify(参考:「Gemify はとってもとっても素晴らしいと思います! - ¬¬日常日記」)
- cutagem(参考:「ヽ( ・∀・)ノくまくまー(2008-06-02)」)
- hoe(同上)
が、今回は勉強のため、これらのライブラリは使わないことにしました。
ライブラリを作る
作り方はざっくりとつかめたので、ライブラリ本体を書きましょう。まずはディレクトリを作ります。
$ 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
おお、問題なく使えてます。やったね☆