RubyGems のパッケージを作ってみた & 自前の gem サーバを建ててみた

RubyGems のパッケージを作り、そのパッケージをインストールするための gem サーバを用意する。
作成した gem を一般に公開するなら、 RubyForge にアップロードすればよいのだろう。
しかし、今回作成するパッケージのプログラムは、限られた利用者だけに公開したいプログラムなので、自前の Web サーバに gem ファイルを設置し、 gem サーバとして機能するように設定した。
サーバの RubyGems のバージョンは 1.2.0 である。*1

gem の作成
gem を作成するために、パッケージにするプログラムの情報を記述した gemspec ファイルを用意する。
以下のサイトを参考に gemspec ファイルを作成した。
るびま
http://docs.rubygems.org/read/chapter/20
パッケージの作成にあたり、プログラムのファイル配置を調整する必要があった。
参考サイトや、他のパッケージのファイル構成を参考に、bin, lib ディレクトリを作成して、適切な場所にファイルを配置した。

gemspec ファイルが作成できたら、gem build コマンドを用いて gem を作成する。
xxx はパッケージ名である。

gem build xxx.gemspec

うまくいけば、パッケージ名に gemspec で指定したバージョン番号がついた名前の gem ファイルができる。
gem ができたら、うまくインストールできるか試してみる。

gem install xxx.-x.y.gem --test

もし、インストールがうまくいかなかったり、テストに失敗するようならば、コードや gemspec ファイルを修正する。
インストールが成功したら以下のコマンドを実行して、 webrick を用いた RubyGems サーバを立ち上げて、 RDoc ドキュメントも正しく生成されているか確認してみよう。

gem server

ブラウザで http://localhost:8808/ にアクセスすれば、RDoc ドキュメントを見ることができる。
gem の設置と公開用の設定

gem ができたら、 Web サーバに gem ファイルを設置して、そこから gem パッケージをインストールできるようにする。
gem ファイルを設置するディレクトリに対し、 Web サーバ側で認証の設定をすることで、パッケージの公開範囲を制限することができる。

今回は以下の URL でリモートレポジトリを公開するとする。
http://yourserver/gemserver/

Web サーバの gemserver ディレクトリに gems ディレクトリを作成し、その中に gem ファイルを置く。
gem ファイルを置いたら、以下のコマンドを実行してインデックスを生成する。

gem generate_index -d

その後、Web サーバ側で gemserver ディレクトリ以下にアクセス制限の設定を行った。

クライアント側からインストールできるか試してみる。

gem install xxx --source http://yourserver/gemserver/

これで、自前の gem サーバができた。
公開してよし。こっそり使ってよし。

作成した gem が他の gem を必要とするときは、依存している gem ファイルを自分の gem サーバに置いておくとよい。
または、インストール時に --remote オプションを付けることで、パッケージが見つからない時に標準のリモートレポジトリへ探しにいってくれるようだ。*2
他の gem サーバにある gem ファイルは以下のコマンドで取得できる。

gem fetch パッケージ名

*1:より新しいバージョンの RubyGems が出ている。

*2:RubyGems の使い方 - WebOS Goodies