LLで全裸ライブラリを作る、というのが流行っているので便乗しよう…と思いたち、どうせ書くならrubygemsにして公開してしまおう、と勢いで作ってみたので作業メモ。ruby版は先に書かれているので、rubygems.orgで公開する手順の方を本題として読んでいただければ。

つくったもの

環境構築

hoeのインストール
% gem install hoe
Successfully installed json_pure-1.4.6
Successfully installed rubyforge-2.0.4
Successfully installed hoe-2.7.0
プロジェクトを作る
% sow ruby_zenra
cp -r /home/{your_name}/.hoe_template ruby_zenra
<snip>
... done, now go fix all occurrences of 'FIX':
ruby_zenra/Rakefile:7:  # developer('FIX', 'FIX@example.com')
ruby_zenra/README.txt:3:* FIX (url)
ruby_zenra/README.txt:7:FIX (describe your package)
ruby_zenra/README.txt:11:* FIX (list of features or problems)
ruby_zenra/README.txt:15:  FIX (code sample of usage)
ruby_zenra/README.txt:19:* FIX (list of requirements)
ruby_zenra/README.txt:23:* FIX (sudo gem install, anything else)
ruby_zenra/README.txt:38:Copyright (c) 2010 FIX

FIX の文字が書いてあるところを修正しましょうね、というアドバイスが出る。

とりあえず進めると…

% cd ruby_zenra/
% rake -T
(in /path/to/project/ruby_zenra)
Hoe email value not set. aborting

おっと。Rakefileにemailを設定しよう。

Rakefile
Hoe.spec 'zenra' do
developer('{your name}', '{your_email@example.com}')
self.rubyforge_name = 'zenra'
end

ここではspecメソッドの引数を変更している。「ruby_zenra」はgithubでのリポジトリ名だけど、gemのパッケージ名は「zenra」にしたい(gem install zenraってやりたい)ので。developerメソッドには名前とメールアドレスを渡す。

ということでもう一度。

% rake -T
(in /path/to/project/ruby_zenra)
which: no dot in ( <snip> )

「dot」がないって怒られている。graphvizというツールに含まれるグラフ記述言語のことらしい。

yak shavingにもほどがあるのでここはカンタンに。

% sudo yum install graphviz-devel

依存パッケージをごっそりインストールされてるけど、まぁとりあえず気にしないことにする。ここではCentOSなのでyumでインストールしたが、macportsにもhomebrewにもあるので問題はないだろう。Windows環境は未検証(ごめん)。

% rake -T
(in /path/to/project/ruby_zenra)
Couldn't read /home/{your_name}.rubyforge/user-config.yml. Run `rubyforge setup`.

rubyforgeのアカウントを用意して「rubyforge setup」を実行する必要がある。

アカウントの準備

ホスティング先のアカウントを作成する。githubは…もうあるよね?ない場合は作っておこう。

rubyforge.org

「New Account」からアカウントを作成。

rubygems.org

ついでにrubygems.orgのアカウントも作成しておこう。詳細は後述。

「sign up」からアカウント作成。rubyforgeより簡単。

% rubyforge setup
# アカウント情報を記入する</span>

【注意】:もう一度叩くと入力したアカウントを初期化されるので気をつけよう(一応バックアップは作られるけど)。また、他人には読めない場所とはいえ平文でパスワードを書くので、他で使ってる重要なパスワードを書くのもやめよう。

プロジェクトの準備

rubyforgeでプロジェクトを作る。

% rubyforge config
% cat ~/.rubyforge/auto-config.yml
# 作ったプロジェクトのgroup_idとpackage_idが判明する
% rubyforge create_package zenra zenra
# プロジェクトをwebから作成済みなので何も出ない
% rubyforge names
groups  : zenra
apackages: zenra

ソースコードはgithubに置きたいのでgithubでリポジトリを作る。とりあえずREADME.txtだけpushしてしまう。

% git init
% git add README.txt
% git commit
% git remote add origin git@github.com:{your_name}/{repository_name}.git
% git push origin master

テストはrspecでやりたいので…

% mkdir spec
% rm -Rf test/

Manifest.txtにはパッケージに含めたいファイルを列挙する。Dir.globでかき集める記法もあるが、seattle.rbの流儀では「プログラマならリリースするファイルに責任を持て」というポリシーのもと、手で列挙することを推奨している(らしい)。

一通りできたらgitにcommitしたりpushしたりすることになる。テストコードも書こう。sowで生成されるテストコードのテンプレには「write tests or I will kneecap you」とある。書かないとおしおきらしいよ。

gemのpublish

rake release VERSION=0.1.0

パッケージの作成とrubyforge / rubygemsへのリリースを行ってくれる。

引数の「VERSION」は最後のだめ押しチェック。ソースコードに記述した「VERSION」定数と一致してる必要がある。

バージョンがあっているとrubygems.orgのアカウントを聞かれるので答える。さっきあらかじめ作ったのは、ここで必要になるから。

Enter your RubyGems.org credentials.
Don't have an account yet? Create one at http://rubygems.org/sign_up
Email:   your_mail@example.com
Password:   ********
Signed in.
Pushing gem to RubyGems.org...
Successfully registered gem: zenra (0.1.0)

これでリリースされた。

rubygemsの確認
% gem search -r zenra
*** REMOTE GEMS ***
zenra (0.1.0)

おおおー。これで世の中の人が「gem install zenra」でこのコードをインストールすることができる。

まとめ

Memo and Tips
  • rake docsでrdocが生成される。デフォルトのREADME.txtはMarkdown形式で書かれていて、このコマンドでレンダリング結果を確認できる。rdocもなるべく書くようにしようねー(書いてないけど)。
  • rubygemsのアカウントを作らされたのは、「これからはrubyforgeからgemcutter改めrubygems.orgでホスティングしていこう」という方針だから、らしい。
  • zenrizeのほうは、先達たちはYahooの「日本語形態素解析」を使っていたので、あえて「日本語係り受け解析」を使ってみた。以前記事を書いたことがあるのと、本家zenra-botがこっちを使ってるから、というのが理由。
感想
  • 「LLによる全裸ブーム」には乗り遅れたので、rubygemsを作って公開する、という方向に重点を置いてみた。
  • コードの部分(特にテスト)は、先にruby版を書いた@yohfeeさんのエントリを参考にさせていただいた。ありがとうございました!
  • rubygemsを公開するというのは気持ちがいいなー、というのが素直な印象。しかし、perlの「Acme」やPHPの「wozozo」のような「笑って許してもらえる名前空間」がないのでちょっと気が引ける。実際あっという間に「これはひどい」タグをいただいてしまったし。
products
hoe
zenrizers
rubygems / rubyforge