シリーズ パッケージマネジメント 【第 1 回】 RubyGems (1)

編集: babie

はじめに

この連載について

現在の Ruby のパッケージ管理は標準がありません。 RPA、RubyGems だけでなく各ディストリビューション・OS 毎にライブラリ・パッケージが提供され、混迷を極めているといっても過言ではありません。 そこで、各パッケージマネジメント環境の主要開発者の話を伺い、各環境を理解し、分類し、 さらに連載終了の暁には、 パッケージマネジメント環境の標準を打ちたてよう! という野望をもってお送りするものであります。

というのは嘘で、RLR の連載で「作者からの声」を寄せてもらった際に、 たまたま RPA、RubyGems の主要開発者が揃っていたので、 ついでだから話を聞いてみようというゆるいノリで始めました。 標準が決まって欲しいなぁという気もないではないですが、 気負わずパッケージに関連する話題を提供していきたいと思います。

今回の記事について

RubyGems の主要開発者 Chad Fowler 氏に開発の経緯を書いてもらいました。 過去・現在・未来の三部作になる予定です。 今回は過去編です。 手を動かすところはないので、気軽にお読み下さい。

The Past, Present, and Future of RubyGems (1)

著者: Chad Fowler, 訳・編: babie

原文 (英文): http://www.rubygarden.org/index.cgi/Libraries/RubyGems-PastPresentAndFuture-part1.rdoc

History

2000 年

2000 年、私は Ruby を使い始めた。 私の記憶が正しければ、ruby-talk メーリングリストで Perl における CPAN に相当するものがあるかどうか、初めて話題に上った。 1999 年初頭、サン・マイクロシステムズ所属の Manpreet Singh がこの話題の最初の投稿者となった。

Subject: [ruby-talk:00247] Ruby Application Arvhive
From: Manpreet Singh <manpreet.singh sun.com>
Date: Wed, 10 Mar 1999 14:07:15 -0800

やあ、誰か Perl の CPAN のように Ruby モジュールをアーカイブする計画って知らない?

perl -MCPAN -e shell

こんな風に簡単にできるやつ。

Thanks
Manpreet

それから、 とりわけ Ruby を支持するトピックが上がった時に、 しばしば議論が持ち上がった。 それは大抵こんな感じだった。

「なんで Rubyは #{なんとかプログラミング言語} のようにメジャーじゃないの?」
「ライブラリが少ないからさ。」
「ライブラリはいっぱいあるじゃないか。何を見つけられないの?」
「うーん、ライブラリは十分にあると思うけど、見つけられないんだ。そんでもってインストールがキツイ!」
「Ruby には CPAN のようなものを作る必要がある! 最高のやつを! 委員会を組織しよう!!」

(…しばらくして…)

「なんで Rubyは #{なんとかプログラミング言語} のようにメジャーじゃないの?」

私はこういった不平不満を別に茶化すつもりはない。 当時は本当に頭の痛い問題だった。 Ruby のソフトウェアをインストールする時、 原始的なインストーラーはあったが、 決まった方法は確立されてなかった。 そして、再帰的な依存性地獄に陥ったもんだ。 特に新規の Ruby ユーザーにとっては 全く苛々する経験だった。

2001 年

2001 年夏、Ruby のパッケージング環境に 2 つの興味深い動きがあった。

まず 1 つは、青木峰郎氏が setup.rb の バージョン 1.0.0 をリリースした事だ。 現在でもとてもポピュラーな setup.rb は、Ruby のパッケージング問題の一部を解決してくれた。 求められていた Ruby のインストーラーに対するデファクトスタンダードとなり、 統一的なパッケージレイアウトの元となった。 でも「CPAN はどこよ?」と探している人達にとっては十分じゃなかった。

2 つ目に、Ryan Leavengood が “RubyGems” と呼ぶプロジェクトを発足した。 RubyGems は、2001 年 8 月に開催された初のインターナショナル Ruby カンファレンスで発表された。 その最初の実装は、Java の jar ファイルのような Ruby のライブラリを 1 つに纏めたファイルを生成し、 その纏めたファイルからロードするために ‘require’ をハックしていた。 発表の時、Matz も出席しており、RubyGems に興味をもったのは間違いない。 そして、標準配布物に同梱できるように Ryan に Ruby の CVS リポジトリのコミット権を与えようと持ちかけた。 Matz は特に “execute” できる機能に興味を持った。 それはこんな感じだ。

$ ruby --gem=myprogram.gem

Ryan のソフトウェアに対する反響と、 相次ぐ「Ruby の CPAN を作れ」という要望に押され、 Ruby カンファレンスの参加者達は協調してセッションを設け、 後に RAA.succ と呼ばれるようになる機能群をまとめた。 多くの委員会主導の努力が無駄に終わる例にもれず、 このバージョンの RAA.succ はついに日の目を見ることはなかった。 しかし、このアイデアは、カンファレンスが終わった後も、 長らく参加したメンバー達の心を捉えて離さなかった。 特に、中心のリポジトリにメタデータを集積するという 「スマートな」パッケージのアイデアは今日にも通用する。

Ruby カンファレンスの後、 興奮はおさまり、 Ryan は RubyGems 0.4.0 を SourceForge でリリースした。 そしてこれが彼の RubyGems における最後の仕事だった。

2002 年

2002 年、活動は混乱していた。 rpkg があり、 installpkg があり、 そして特筆すべき RAA-Install があった。 RAA-Install は RAA のメタデータを基に自動でインストールをするという、真に野心的な試みだった。 それは Ruby の標準配布物に同梱して欲しいという Wiki 上の請願書にサインするかなりの数の支持者を集めた。

多くの Rubyist 達のひたむきな努力にもかかわらず、 Ruby コミュニティのための 確固たる、いつでもどこからでもアクセスできるパッケージマネジメントの仕組みは用意されないまま、 2002 年は過ぎ去った。

2003 年

そしてまた、2003 年も同じ状況のまま過ぎ去った。 ただ、11 月末の Ruby カンファレンス、 我々の優しい独裁者である Matz との懇談会で、 David Black は、この件に関しては、もっと厳しくもっと独裁的に振舞って欲しいと提案した。

その時、Matz はこういうようなことを言った。 「誰か作ってくれたら、Ruby の標準配布物に含めるよ。」 そして Rich kilmer はすぐに、 まさしく素早く、 数人を引き連れて、 ホテルのバーで作り上げてしまった。 コードとカフェインで満たされた長い夜が明けて、 私達の手には新生 RubyGems があった。 それは ライブラリとその依存するものをリモート・インストールできるという 基本的な機能を備えていた。 私達は Ryan のオリジナルと同じ名前をつけた (Ryan の許可はもらっている)。 しかし、2001 年版 RubyGems と 2003 年版 RubyGems との類似点は、 その目標である Ruby コードを配布する方法を簡略化し標準化するという点だけだった。

Nuts and Bolts

我々が初期にリリースした RubyGems のもっとも面白く (そして賛否両論の) 機能は、 同一のライブラリの複数のバージョンを同時に管理できるようにしたことだ。 例えば、RedCloth の 2.0.3、3.0.0、3.0.3 を全てインストールし、 スクリプト毎にどのバージョンを使うか選択できるのだ。 具体的には、バージョンを指定する為に比較演算子を使うことができる。 例えば、RedCloth 3 もしくはそれ以上のバージョンでしか動かないライブラリがあったと場合、下記のようにすれば良い。

require_gem 'RedCloth', '>= 3.0.0'

こうして、適切なバージョンの RedCloth を $LOAD_PATH に加えて、 前もってパッケージ作成者が autorequire 属性で指定おいたファイルを、自動で require することができる。

また、バージョン指定演算子はインストール時にも使える。

$ gem install redcloth --version ">= 3.0.0"

この場合も、バージョンの指定がない場合も、 最新のバージョンが使用される。

議論を呼ぶところは、 これらの機能を実装するために RubyGems の配布物を全て専用のディレクトリに置く方法を採用したということである。 我々はこの方が行儀がいいと思ったのでそうした。 そのおかげで、RubyGems 管理外のファイルを消してしまう心配をしないで、安全に扱うことができるのだ。

To be continued

次回は、現在の RubyGems の状況についてお伝えします。 リリースしてから今日まで RubyGems のダウンロード数は 4 万件、 ライブラリとアプリケーションのリモート・インストール数は 30 万件を超えるまでになっています。 初期リリースから 1.0 までの進化の過程を追ってみようと思います。

著者について

Chad Fowler はある巨大な多国籍企業のソフトウェア開発者 兼 マネージャーです。 最近はインドに住んで働いており、オフショア・ソフトウェア開発センターを設置し率いています。 また、Ruby Central の共同設立者でもあります。 Ruby Central は非営利企業で、 毎年行われる インターナショナル Ruby カンファレンス を主催し、 Ruby コミュニティを支援しています。

次回予告

RPA の主要開発者 Mauricio FernaOdez 氏に開発の経緯等を述べてもらおうと思っています。が、しかし、オファーも了承してもらい、案も出してもらっているのですが、多忙なためか連絡が途絶えております (汗。 というわけで、未定です。

シリーズ パッケージマネジメント 連載一覧