WebOS Goodies

WebOS の未来を模索する、ゲームプログラマあがりの Web 開発者のブログ。

WebOS Goodies へようこそ! WebOS はインターネットの未来形。あらゆる Web サイトが繋がり、共有し、協力して創り上げる、ひとつの巨大な情報システムです。そこでは、あらゆる情報がネットワーク上に蓄積され、我々はいつでも、どこからでも、多彩なデバイスを使ってそれらにアクセスできます。 WebOS Goodies は、さまざまな情報提供やツール開発を通して、そんな世界の実現に少しでも貢献するべく活動していきます。
Subscribe       

RubyGems の使い方

本日は Ruby の標準パッケージ管理システムである RubyGems のご紹介です。最近ではほとんどの Ruby 用ライブラリが RubyGems を当然のように採用していて、ドキュメントにも RubyGems によるインストール方法しか掲載されないようになってきました。私はこれまで本当に必要最低限の知識だけでやり過ごしてきたのですが、だんだんと不都合もでてきたので、少し詳しい使い方を調べてみました。けっこう便利な機能がいろいろあって、勉強不足を思い知った次第です。そのようなわけで、日常的なパッケージ管理の方法を中心に、基本的な使い方をご紹介します。私のように、とりあえずいろいろなパッケージをインストールして更新もせずに放置しているという方は、参考にしていただければと幸いです(^^ゞ

なお、今回ご紹介するのは RubyGems でパッケージを利用する際の使い方で、パッケージの作成など今後の課題ということでお願いします。また、基本部分をわかりやすくご紹介することを優先しているため、あまり使わない機能などは独断と偏見で割愛しています。あらかじめご了承くださいませ。

RubyGems をインストールする

それでは、まずは RubyGems 自体のインストール方法、最新版への更新方法をご紹介しましょう。 Ruby が動作する環境であれば、簡単にインストールできます。

インストール方法

ほとんどの Linux ディストリビューションでは RubyGems がデフォルトで利用可能か、もしくはパッケージが用意されていると思います。 Win32 では One-Click Ruby Installer を使うのが手軽でしょう。 Cygwin 環境など、標準パッケージが用意されていない場合でも、以下のコマンドを実行するだけでインストールできます。

wget http://rubyforge.org/frs/download.php/17190/rubygems-0.9.2.tgz
tar zxvf rubygems-0.9.2.tgz
cd rubygems-0.9.2
ruby setup.rb

ダウンロードするファイルはインストール時点の最新版に変更したほうが良いでしょう。利用可能なファイルはこちらのページで確認できます。

アップデート方法

インストール後に RubyGems が更新された場合は、以下のコマンドを実行するだけで最新版にアップデートできます。

gem update --system

ただし、私が試した限り One-Click Ruby Installer の環境では正常に更新できませんでした。インストーラでまとめてアップデートするのが無難かもしれません。該当する環境の方はご注意ください。

gem コマンドの使い方

インストールが済んだところで、実際に使ってみましょう。 RubyGems のほとんどの機能は gem というコマンドで利用できます。基本的な書式は以下のようになります。

gem <サブコマンド> [オプション] [パラメータ]

gem コマンドはさまざまな機能を持っていますので、どの機能を実行するかをサブコマンドで指定します(正式なドキュメントでは「command」と呼ばれていますが、紛らわしいので「サブコマンド」と呼びます)。利用可能なサブコマンドのリストは以下のコマンドで表示できます。

gem help commands

オプションパラメータはサブコマンドに依存します。それらの詳細は以下のコマンドで確認できます。

gem help <サブコマンド>

このように gem コマンドには優秀なヘルプ機能が付いていますので、機能ごとのリファレンスはあまり必要ありません。ですので、ここではパッケージの管理タスクごとに、それぞれのサブコマンドの具体的な使用方法をご紹介していこうと思います。

パッケージのインストール

まずはパッケージのインストール方法を知らなければ話が始まりませんね。リモートリポジトリ(通常は RubyForge)からパッケージをダウンロードしてインストールするには、以下のコマンドを実行します。

gem install --remote <パッケージ名>

このコマンド一発ですべてのインストール作業を自動的に実行してくれます。他のパッケージが必要なら、それらも自動的にインストールしますので、インストール後には確実に利用可能になっているはずです。

なお、上記の例で付加している "--remote" は検索対象をリモートリポジトリのみに限定するオプションです。デフォルトでもローカルとリモートの両方を検索するのですが、混乱を避けるために明示したほうが良いかと思います。ローカルリポジトリとリモートリポジトリについては、後の「ローカルリポジトリの公開」を参照してください。その他、以下のオプションがよく利用されます。

オプション機能
--version バージョン 指定バージョンをインストール
--[no-]rdoc RDoc 形式のドキュメントを生成する[しない]
--[no-]ri ri コマンドで読めるドキュメントを生成する[しない]
--force 依存性チェックをスキップして強制インストール
--ignore-dependencies依存パッケージをインストールしない

"--version" オプションのバージョン指定は、単に "1.0.0" などと記述すれば正確にマッチするバージョンになりますし、 "<1.0.0" のように演算子を付けることもできます。利用可能な演算子は以下のとおりです。

演算子意味
= 指定バージョン(デフォルト)
!= 指定バージョン以外
> 指定バージョンより新しいもの
>= 指定バージョンか、より新しいもの
< 指定バージョンより古いもの
<= 指定バージョンか、より古いもの
~> "~>2.0" とすると、 2.x 系列で最新のものになる

また、 RubyGems は同時に複数のバージョンをインストールできます。例えばバージョン 1.0.0 と 2.0.0 をインストールして、アプリケーションごとに適切なバージョンを利用することも可能です。詳細は後の「ライブラリの利用方法」をご覧ください。

パッケージのアップデート

インストール済みパッケージを最新版に更新するときは、 update サブコマンドを使います。

gem update [パッケージ名]

パッケージ名が省略された場合は、すべてのパッケージを更新します。オプションとしては、 install サブコマンドでご紹介したものがすべて有効です。 outdated サブコマンドを使うと、更新が必要なパッケージを一度に確認できて便利です。

gem outdated

また、前述のとおり RubyGems では複数バージョンのパッケージがインストールできますので、パッケージを更新しただけでは旧バージョンは削除されません。最新バージョンを残して旧バージョンをすべてアンインストールするには、 cleanup サブコマンドを使います。

gem cleanup [パッケージ名]

やはりパッケージ名を省略するとインストール済みの全パッケージが対象となります。 "--dryrun" オプションを付けて実行すると、実際の削除は行わずにアンインストールされるパッケージ・バージョンが表示されますので、必ず確認しましょう。

パッケージのアンインストール

特定パッケージを削除するには、 uninstall サブコマンドを使います。

gem uninstall <パッケージ>

もし複数のバージョンがインストールされている場合は、それらを列挙してどのバージョンを削除するかを尋ねてきます。また、他のパッケージが削除しようとしているパッケージに依存している場合は、本当に削除して良いかを確認してきます。よく使用するオプションは以下のとおりです。

オプション機能
--all 該当するすべてのバージョンを削除する
--version バージョン 対象バージョンの指定

パッケージの検索

インストールするパッケージの名前がはっきりしないときは、 search サブコマンドで検索をかけることができます。

gem search --remote <検索文字列>

名前に検索文字列を含むパッケージをリストアップしてくれます。検索文字列をもう少し細かく指定したいなら、 query サブコマンドを使って正規表現検索することもできます。

gem query --remote --name-matches <正規表現>

名前が正規表現にマッチするパッケージをすべて表示してくれます。 "--name-matches" オプションを指定し忘れるとリモートリポジトリのパッケージ全てが表示されますので注意してください(^^;。

インストール済みパッケージの情報取得

インストールされているパッケージを確認するには、単純に search サブコマンドを実行すれば OK です。

gem search

これでインストール済みパッケージの一覧が表示されます。もちろん、検索文字列を指定してパッケージを絞り込むこともできます。

さらに、特定のパッケージに含まれるファイルの一覧を見たい場合は、以下のコマンドを実行してください。

gem contents [--version <バージョン>] <パッケージ名>

指定したパッケージに含まれるファイルがフルパスでリストアップされます。 バージョン の指定方法は install サブコマンドなどと同じです。

ライブラリの利用方法

RubyGems でインストールしたライブラリはバージョン管理が行われるので、読み込むのにちょっとした手続きが必要です。大したことではないので、こういうものだと思って覚えてしまいましょう。

最新のライブラリを読み込む

RubyGems でインストールしたライブラリ利用する際は、必ずスクリプトの最初で 'rubygems' を読み込んでください。

require "rubygems"

あとは、通常どおりライブラリを require するだけで OK です。もし複数のバージョンがインストールされている場合は、その中で最新のものが読み込まれます。

バージョンを指定して読み込む

特定バージョンのライブラリを使いたいときは、 "rubygems" を require した後に gem を使ってバージョンを指定します。例えば、以下の例は active_record のバージョン 1.14.0 を読み込みます。

require "rubygems"
gem "active_record", "=1.14.0"
require "active_record"

バージョン指定の方法は install サブコマンドの "--version" オプションと同じです。このほか、 User Guide では YAML 形式の設定ファイルで外部からライブラリのバージョンをコントロールする方法なども解説されています。興味のある方はご参照ください。

非 Gems 環境に対応する

RubyGems でインストールしたライブラリを利用するには、上記のとおり事前に "rubygems" を読み込む必要があります。しかし、これだと RubyGems のない環境では動かないスクリプトになってしまいます。そこで、 "rubygems" の読み込みを省略する手段が用意されています。

まずひとつめはコマンドラインオプションを利用する方法です。 ruby コマンドに "-rubygems" をつけてスクリプトを実行すれば、 "rubygems" を自動的に読み込んでくれます。

ruby -rubygems some_script.rb

もうひとつは、環境変数 RUBYOPT を利用する方法です。以下のように設定すると、 "-rubygems" オプションと同じ効果を持ちます。

export RUBYOPT=rubygems

このいずれかの方法をとることで、 RubyGems を使わずにライブラリをインストールした場合でも動作するスクリプトを書くことができます。しかし、今度は逆に RubyGems で上記の設定を行わない場合には動かなくなるというジレンマが発生してしまいます。この問題を回避する正しい方法がいまいちわからないのですが、 Gentoo Linux では以下の短いスクリプトを暗黙的に require しているようです。

begin
require "rubygems"
rescue LoadError
end

現状で RubyGems 環境のある・なしに関わらずスクリプトが実行できるようにするには、これをスクリプトの先頭に入れるのが無難かもしれません。あんまり美しくないですね(´〜`;

ローカルリポジトリの公開

gem の多くのコマンドでは、以下のオプションが共通で利用できます。

オプション機能
--local ローカルリポジトリのみを対象にする
--remote リモートリポジトリのみを対象にする
--both ローカル、リモートの両方を対象にする

リモートリポジトリとはネットワーク上に存在する RubyGems サーバーに存在するパッケージ群のことで、通常は "http://gems.rubyforge.org" に設定されています。ローカルリポジトリはローカルファイルシステム上に存在するリポジトリで、リモートリポジトリからインストールしたパッケージは自動的にローカルリポジトリにコピーされます。そのようなわけで、リモートリポジトリのパッケージを検索する際は "gem search --remote" としましたし、ローカルにインストール済みのパッケージを検索する場合は "gem search" となるわけです(search サブコマンドは "--local" がデフォルトです)。

このような仕組みにするひとつのメリットとして、なんと自分自身が RubyGems サーバーとなり、ローカルリポジトリにあるパッケージを他のマシンに供給することができます。方法は、単純に gem_server コマンドを実行するだけです。

gem_server

これだけで、 WEBrick による Web サーバーが起動し、そのマシンが新たな RubyGems サーバーになります。他のマシンで以下のコマンドを実行すれば、このサーバーからパッケージをインストールすることができます。

gem install --remote --source http://<サーバーのホスト名>:8808 <パッケージ名>

指定したパッケージがサーバーになければ、デフォルトのリモートリポジトリである "http://gems.rubyforge.org" から取得します。 gem_server を起動したマシンをパッケージのキャッシュとして使えるほか、自作パッケージを配布することもできます。自作アプリケーションの簡易デプロイシステムとしても使えるかもしれませんね。

また、 gem_server のもうひとつの機能として、ドキュメントの閲覧環境の提供があります。いくつかパッケージをインストールしたマシンで gem_server を起動し、今度は通常の Web ブラウザで "http://localhost:8808/" にアクセスしてみてください。インストール済みパッケージの RDoc ドキュメントが閲覧できるはずです。もちろん他のマシンからもアクセスできます。主なパッケージはインターネット上でもドキュメントを公開していますが、 gem_server はネット回線がなくても利用できること、単一のページから必要なドキュメントにアクセスできることなどの利点があります。必要に応じて使い分けてください。

以上、本日は RubyGems による基本的なパッケージ管理の方法をご紹介しました。これだけ知っていれば、日常的なパッケージ管理タスクは問題なくこなせるのではないでしょうか。とくにライブラリの更新チェックや複数バージョンの管理機能は、アプリケーションの安定性を保ちつつライブラリを更新していくのになくてはならない機能ですね。いまのうちに調べておいて助かりました(笑)。 RubyGems を活用して、豊富なパッケージを存分に使い倒していきましょう!


追記 (2007/4/4)

当初、ライブラリの読み込み方法としてご紹介していた require_gem メソッドは廃止予定となっており、既に動作しなくなっていました(正確には autorequire が効きません)。現在は新しい gem メソッドを使う方法が推奨されているようなので、そちらに差し替えてあります。大嘘を書いてしまって、たいへん申し訳ありませんでした。ご指摘くださった kazutanaka さん、ありがとうございます。いつも助かります(^^ゞ

追記 (2007/6/1)

activerecord → active_record も修正しました。うお〜ん(´Д`;

関連記事

この記事にコメントする

Recommendations
Books
「Closure Library」の入門書です。
詳しくはこちらの記事をどうぞ!
Categories
Recent Articles