(この記事は Ruby Advent Calendar jp:2010 の 22 日目。前日は yuunachan さんでした)

# gem を一度も作ったことない人が gem を初めて作ってみる話です
# この記事を読んで、「gem って意外と簡単に作れるんだ〜」と思ってもらえれば幸いです


ということで、gem 作ってみましょー

まず、gem の生成に必要なファイルを全部一から書くとか気が遠くなる作業なので、ライブラリを使ってひな形をどかどか〜っと作ってしまいます。今だと jeweler っていうライブラリが良いようなのでさくっとインストール。

gem install jeweler

んで、さっそくひな形を作ってみます。--rspec って付けると、付属するテストを RSpec 仕様にしてくれます。指定しないと Test::Unit ですのでこれはお好みで。--create-repo を付けると github にリポジトリをあらかじめ作ってくれます。あ、最後の misawa っていうのがこの gem の名前です。地獄のミサワにハマっt

[sasata299@localhost] $ jeweler --rspec --create-repo misawa
        create  .gitignore
        create  Rakefile
        create  Gemfile
        create  LICENSE.txt
        create  README.rdoc
        create  .document
        create  lib
        create  lib/misawa.rb
        create  spec
        create  spec/spec_helper.rb
        create  spec/misawa_spec.rb
        create  .rspec
Jeweler has prepared your gem in misawa
Jeweler has pushed your repo to http://github.com/sasata299/misawa

どかどか〜っと色んなファイルが生成されましたね。おめでとうございます。これで大体8割型完成です。github にもリポジトリが出来ましたよ☆

https://github.com/sasata299/misawa
misawa

そしたら bundle を使って必要なライブラリをがしがしっとインストールします。bundle が無くて動かないよーって人は gem install bundle しといて下さいね。

[sasata299@localhost] $ bundle
Fetching source index for http://rubygems.org/
Using rake (0.8.7) 
Using bundler (1.0.7) 
Installing diff-lcs (1.1.2) 
Using git (1.2.5) 
Using jeweler (1.5.1) 
Installing rcov (0.9.9) with native extensions 
Installing rspec-core (2.1.0) 
Installing rspec-expectations (2.1.0) 
Installing rspec-mocks (2.1.0) 
Installing rspec (2.1.0)


Rakefile の中の summary と description は要変更です。

では、次に gem の本体(lib以下)を作りましょう。これが無いと gem にする意味が無いですよね。lib/misawa.rb を以下のようにしてみました。適当です。

class Object
  def misawa(msg)
    puts "#{msg} ってそれどこ情報よー"
  end
end

puts する感覚で misawa というメソッドを使うと、後ろに「ってそれどこ情報よー」っていう非常にウザい台詞を追加してくれます。

で、完成したので(実際はテストとかも書いてくださいね)、これを gem にして他の人もインストールできるようにしてみましょう。

おまじないを唱えて

rake version:write # VERSION ファイルの生成(ちゃっかり 0.0.1 にしました)
rake gemspec       # misawa.gemspec ファイルの生成

変更のあったファイル達をコミットして…。そして!このコマンドで gem を生成します!!

[sasata299@localhost] $ rake build
WARNING:  no rubyforge_project specified
WARNING:  description and summary are identical
  Successfully built RubyGem
  Name: misawa
  Version: 0.0.1
  File: misawa-0.0.1.gem

キタ━━━━(゚∀゚)━━━━!!

ゴ、ゴクリ。そしてこのコマンドを打つと・・・

[sasata299@localhost] $ rake release
Committing misawa.gemspec
Pushing master to origin
Tagging v0.0.1
Pushing v0.0.1 to origin
Generated: misawa.gemspec
misawa.gemspec is valid.
WARNING:  no rubyforge_project specified
  Successfully built RubyGem
  Name: misawa
  Version: 0.0.1
  File: misawa-0.0.1.gem
Executing "gem push ./pkg/misawa-0.0.1.gem":
gem push ./pkg/misawa-0.0.1.gem
Enter your RubyGems.org credentials.
Don't have an account yet? Create one at http://rubygems.org/sign_up
   Email:   
Password:
Signed in.
Pushing gem to RubyGems.org...
Successfully registered gem: misawa (0.0.1)

出来ました!!こんなんで全世界に公開!!何て簡単なのあなたは!!

ちなみに「rubygems.org のアカウント持ってなかったら http://rubygems.org/sign_up から作ってね」ってメッセージが表示されますがそこからは作れませんでした。。正しい URL は https://rubygems.org/users/new ですね、多分。

これで rubygems にさっきの misawa っていうへっぽこ gem が上がりました。あとは自由にインストールして使うことが出来ます。

https://rubygems.org/gems/misawa
rubygems

[sasata299@localhost] $ gem sources -a http://rubygems.org/
http://rubygems.org/ added to sources

[sasata299@localhost] $ gem install misawa
Successfully installed misawa-0.0.1
1 gem installed

↓のような感じで使えます。簡単でしたね♪

require 'rubygems'
require 'misawa'

misawa "ささたつです" # ささたつです ってそれどこ情報よー