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

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

(次回試そうと思っている)GitHubでRubyGemを公開する手順

前々回の記事で「次回は、Ruptaを作成・公開するにあたって工夫した点や苦労した点について書こうと思っています」と予告しました。前回の記事ではライブラリインターフェースについて触れただけでしたので、今回は、工夫した点と苦労した点について触れながら、GitHubでRubyGemを公開する手順をまとめてみます。

1. ライブラリ名を決める

せっかくライブラリのアイデアが浮かんだのに、名前が決まらないから作るのやめた、という方も多いのではないでしょうか(そうか?)。私も「Rupta」に決めるまであれこれ悩みました。ライブラリの目的が分かりやすいのは「なんとかrouter」かなとか、でも短い名前のほうがRubyっぽいかなとか。

そんなとき、なんとなく「route」という単語の語源が気になったので、スペースアルクの語源辞典で調べてみました。

route
(森の裂け目)(切り開かれた)道、道筋、進路、航路
[語源] L.rupta(=切り開かれた)

http://home.alc.co.jp/db/owa/etm_sch?instr=route&stg=1

おお、「rupta」ってかっこいいかも! それで「Rupta」に決めたのでした。よいライブラリ名が浮かばない方は語源辞典を引くとあっさり決まるかもしれません。

2. Jewelerでワーキングディレクトリを作る

Jewelerの存在を知ったのは、Ruptaをほぼ作り終えた後でした。ビルドするためgemspecファイルを書こうと思ったのですが、これがなかなか面倒なのです。

で、ググると、yharaさんの記事「gemspecの作り方がわからない?ならばjewelerだ」に行き当たりました。

githubなりrubyforgeなりでgemを公開するときに必要となるのがgemspecファイルですけれども、これは手書きするのははっきりいってめんどい。それをなんとかしてくれるgithubおすすめの ツールができたらしい。

その名もjeweler。

確かに、http://gems.github.com/ に「We recommend using Jeweler, a GitHub specific gemspec builder, to maintain your gemspec.」とありますね。

JewelerのREADMEとともに、id:yssk22さんの記事「jewelerとgithubで始める初めてのRubyGem作成」を参考にしつつ、テストディレクトリを「jeweler jeweler_test」して、RakefileをRuptaに取り込んだりしたのですが、だったら最初から「jeweler rupta」すべきだったと思っています(知らなかったので仕方ないですが)。

ただ私は、まだJewelerを使いこなせていません。「rake version:bump:patch」で「git commit」されたり、コミット後に「rake release」するとエラーになったり、予想に反した動きをするので、ちゃんと使う前に調べないといけないなと思っています。

3. BDD

さて、いよいよライブラリを書きましょう。書き方としては、やはりBDD(仕様を書いてから実装)が理想的なのだろうと思います。

あえてBDDと書いたのは、TDDだと考えると、どんな「テスト(test)」を書けばよいか分からなくなりがちだからです。Ruptaでも先に実装を書いてしまいました。その後「アジャイル開発のコツ 〜キーワードは“視点変換”〜」と題されたpptを読み、ようやくTDDをBDDと捉えることの重要性に気づいた次第です。ライブラリの仕様が固まっていさえすれば、「振る舞い(behavior)」は定義できるはずです。次回こそBDDで進めます。

4. ライセンスを決める

Ruptaを修正BSDライセンスにするかMITライセンスにするかで悩んだのですが、「オープンソースソフトウェアの育て方」の「ライセンスを選ぶ」を読んで、MITライセンスに決めました。

オープンソースソフトウェアの育て方」には「名前の決定」など当記事と関連することが多々書かれているので早く全部読め>俺

5. READMEを書く

RuptaのREADMEは、Description、Installation、Examples、Requirement、Dependencies、Copyrightの順で書きました。が、「CPANモジュールのドキュメントの良いところ」を真似して、先にSYNOPSISを持ってくるのが良いのかもしれないと考えています。

6. ソースコード等をGitにコミットする

ライブラリやドキュメントが大体できたら「git commit」します。できていなくてもコミットしていいわけですが、まあ好みです。

7. ライブラリをGitHubで公開する

「rake release」するなり「git push origin master」するなりして、GitHubでライブラリを公開します。

事前にRutHubリポジトリの管理画面でRubyGemチェックボックスにチェックし、リリース対象にgemspecファイルを含めておけば、GitHub上でGemが作られます。便利。

8. ドキュメントをGitHubで公開する

ドキュメントの公開はGitHubでなくてもよいわけですが、せっかくGitHub Pagesという仕組みがあるので、次のライブラリでもそれを使おうと思っています。

今のところ、masterブランチで「rake rdoc」してドキュメントを作り、それをgh-pagesブランチにコピーしてコミットしていますが、ちょっと面倒なので、Grancherを使ってみようかなと考えています。

意外と簡単かも

Ruptaの作成・公開にあたっては、色々と分からないことが多く、実装より実装以外に費やした時間のほうが長かったというのが正直なところです。が、一度経験してしまえば、あとは同じことをこなすだけという印象です。作ったのが簡単なライブラリだったからかもしれません。次はもう少し複雑な何かを作るつもりです。