RubyGems パッケージの作り方 - rubyforge 登録まで

日本語の解説で RubyGems パッケージの作り方や rubyforge 登録までの一連の方法が書いてあるところを見かけたことがないため、エントリーにしてみます。なれると割と簡単です。

優しい RubyGems パッケージの作り方

newgem コマンドでのひな形作成

http://drnicwilliams.com/2006/10/11/generating-new-gems/
perl には module-starter など、CPAN モジュールのひな形を作ってくれる便利なユーティリティがありますが、gem でそれにあたるのが newgem というパッケージです。
使い方は簡単で、

# gem install newgem

で newgem をインストールしてから newgem コマンドを実行するだけで以下のようにひな形を作ってくれます。

$ newgem packagename
creating: packagename
creating: packagename/CHANGELOG
creating: packagename/README
creating: packagename/lib
〜以下略〜

そして cd packagename してから rake package で gem パッケージがもうできあがります。すてき!簡単!

$ rake package
(in /home/gorou/tmp/ruby/gem/packagename)
rm -r .config
〜中略〜
  Successfully built RubyGem
  Name: packagename
  Version: 0.0.1
  File: packagename-0.0.1.gem
mv packagename-0.0.1.gem pkg/packagename-0.0.1.gem

これで pkg ディレクトリ以下に gem と tar の package ができあがってます。めっちゃらく!
なお rubyforge にアップロードの予定がある人は、packagename は rubyforge のプロジェクトの unix アカウント名(後述)にしておいた方が無難です。

ひな形のカスタマイズ

で、普通は lib 以下にライブラリを作ったり、test を書いたり、README をきちんと書いたりします。その後 Rakefile を自分なりにカスタマイズしましょう。上の方の

AUTHOR = "secondlife"
EMAIL = "your contact email for bug fixes and info"
DESCRIPTION = "description of gem"
RUBYFORGE_PROJECT = "packagename"

あたりは適当に書き換えるとして、真ん中あたりの

#s.add_dependency('activesupport', '>=1.3.1')
#s.required_ruby_version = '>= 1.8.2'

とコメントアウトされている箇所を、依存関係で入れたいパッケージがあれば適当に書き換えます。たとえばライブラリ内部で ActiveRecordActiveSupport を使ってるので gem のインストール時に一緒に依存ライブラリとして追加したければ以下のように。

s.add_dependency('activerecord')
s.add_dependency('activesupport')

これで RubyGems パッケージの作り方は終わりです。かんたんに作れますね。

rubyforge への Package 登録の方法

rubyforge とはいわゆる sourceforge みたいな ruby のライブラリを簡単に登録できるウェブサービスです。BTS やらフォーラムやら様々な機能を持っていますが、実際に活用されてるのは

あたりでしょう。今回は登録の手順から svn の checkout/commit 、gem パッケージのアップロードまで解説します。

ユーザ登録

まず https://rubyforge.org/account/register.php からユーザ登録をしましょう。ログイン名は unix のユーザアカウントにもなります。

プロジェクトの登録

http://rubyforge.org/register/
から登録を行います。

Project full name

プロジェクト名です。Hatena API Graph とかそういう。これは後からでも変えられ(たしか)ます。

Project Purpose And Summarization

これはたぶん rubyforge 管理している人がプロジェクトの 許可/拒否 するのに使うところなので熱い思いを込めて書きましょう。
ちなみにいままで自分が申請したプロジェクトはほぼ一行の適当サマリーでしたがすべて通ったので、適当でも良さそうです(マテ)。

License

適当なライセンスを選びましょう。

Project Public Description

概要です。後からでも変えられます。

Project Unix Name

プロジェクトの unix アカウントの名前です。たとえば example で登録すると、もらえるサブドメインが example.rubyforge.org になったり、svnレポジトリが /var/svn/example になったりしますので割と慎重に決めましょう。

SCM

好きな方を選びましょう。ちなみに CVS は選んだことがありません。最近の subversion子は問答無用で SVN でいいでしょう。

さて、すべてに記入して submit を押すと申請されます。なお実際にプロジェクトの認可が下りるまでにだいたい数時間〜十数時間かかります。

ssh の公開鍵の登録

rubyforge を簡単に使うには ssh の公開鍵の登録が欠かせません。今後解説する subversion の利用でも svn+sshssh の公開鍵が登録されてると何かと便利です。
というわけで scp なりなんなりで username@rubyforge.org:.ssh/authorized_keys を置いておきましょう。

subversion レポジトリのチェックアウト

プロジェクトの認可が通ったらせっかくなので rubyforgesubversion レポジトリを使ってみましょう。
チェックアウトは

svn co svn+ssh://secondlife@rubyforge.org/var/svn/example ./

な感じで。公開鍵が登録されており ssh-agent や keychain を使ってれば毎回パスワードの入力いらなくなるので楽です。また、デフォルトでは誰でも

svn co svn://rubyforge.org/var/svn/example ./

svn プロトコルでチェックアウトできます。

gem パッケージのアップロード

それでは rake package などで作成した gem パッケージをアップロードしてみましょう。プロジェクトページから右上の「ファイル」を選び、「To create a new release click here.」をクリックするするとアップロードの画面が表示されます。
そこで適当に入力して ( FileType は .gem にすることを忘れずに!)アップロードし、少したつと gem install packagename で登録したパッケージが rubyforge から gem コマンドでインストールできるようになります。

web へのコンテンツのアップロード

rubyforge では http://hatenaauthapi.rubyforge.org/ のように、自分で scp などでコンテンツをアップロードすることができます。デフォルトのままでは寂しい感じなので、rdoc で作ったドキュメントをアップロードしておきましょう。
そんなときは Rake::RubyForgePublisher を使えば簡単です。Rakefile の一番下に

Rake::RDocTask.new do |rdoc|
  rdoc.rdoc_dir = 'html'
  rdoc.options += RDOC_OPTS
  rdoc.template = "#{ENV['template']}.rb" if ENV['template']
  if ENV['DOC_FILES']
    rdoc.rdoc_files.include(ENV['DOC_FILES'].split(/,\s*/))
  else
    rdoc.rdoc_files.include('README', 'CHANGELOG')
    rdoc.rdoc_files.include('lib/**/*.rb')
  end
end

desc "Publish to RubyForge"
task :rubyforge => [:rdoc, :package] do
  Rake::RubyForgePublisher.new(RUBYFORGE_PROJECT, 'rubyforgeのアカウント名(secondlifeとか)').upload
end

を記述しておくと、

rake rubyforge

コマンドで rdoc なドキュメントが生成されて scp で自動でアップロードされます。

というわけで rubyforge の登録も割と簡単なので、いままでめんどくさそうと敬遠していた人も是非パッケージを作って rubyforge にアップしましょう!