Merbを入れてみた

2008/11/14 Update

この情報は2008年1月3日の、Merb 0.5の段階のものです。先日リリースされた1.0では変更している部分が多いですので参考になりません。
merb.jpを取得してmerb wiki for japaneseを開始しました - Post-itみたいな」や「http://wiki.merb.jp/」の方をご参考ください。

Merbってなんぞ

Mongrel作者のZedがブログで"Rails Is A Ghetto"というタイトルでエントリを書いていますが、その中に"Merb"というRailsとは別のRubyフレームワークが出ています。俺はこのエントリを読むまで存在を知らなかったのですが、調べてみるとこんなものを発見。

引用元: ヽ( ・∀・)ノくまくまー - 優しい Merb の育て方

  • コアはシンプルに (必要な機能はプラグインとして追加させる)
  • thread safe
  • cgi.rb を使っていない
  • 高速な ERb エンジンである Erubis を標準装備
  • Rails に似ている (機能、ファイル配置)
  • 大体3倍くらい速い (Rails Mongrel との比較)

Railsの3倍早いという言葉に惹かれて、早速環境を整えることにしました。

インストール

引用元の優しい Merb の育て方にもインストール方法が書かれていますが、公式サイトを見る限りRubygemsで一発インストールが可能なようです・・・・・・が、なぜか俺がやってみると必須のはずのrspecをインストールしてくれなかったので、もしインストールされなかったら手動でやる。ですので俺がやったコマンドは以下の通り。

> sudo gem install merb rspec --include-dependencies

Rubygemsでインストールできるのは0.4.2で、svnレポジトリからダウンロードできるのは0.5.0みたいです。もし0.5.0を使う場合は以下のコマンドでいけるっぽいです。

引用元: Merb README
> sudo gem install mongrel json json_pure erubis mime-types rspec hpricot mocha rubigen haml markaby mailfactory Ruby2Ruby -y
> svn co http://svn.devjavu.com/merb/trunk merb
> cd merb
> rake install

svnコマンドを使いますが、お使いの環境にSubversionを入れられないのでしたらsvnレポジトリにあるファイルを手動でダウンロードするのも手です。-yオプションつけなかったらいくつか質問されるみたいですが、基本yesでいいみたいなのでつけておいた方が楽だと思います。

プロジェクト生成及び実行

merb apps
cd apps
merb

まずmerbコマンドでプロジェクトを生成します。この例ですとappsという名前のプロジェクトです。その後プロジェクトのトップディレクトリへ移動し、merbコマンドでサーバの立ち上げです。デフォルトで使われるのは4000番ポートですが、プロジェクト生成時に-pオプションで使用するポート番号を指定できます。
その後127.0.0.1:4000へアクセスすると400 Bad Requestになります。何か適当なパラメーターを与えると404 not foundとなります。立ち上がらなかったらconfig/merb.yml内の:hostを書き換えることになるんじゃないかと思います。

デルレイヤーを準備する

Merbはモデルレイヤーを持たないので、他のプログラムを使う必要があります。いくつか選択肢があるみたいですが、ここではActiveRecordを使います。

DB接続

ActiveRecordを使うにはmerb_activerecordが必要です。

> sudo gem install merb_activerecord

また、config/dependencies.rb内の"if you need a database."以下のuse_orm :activerecordのコメントを外します。それとActiveSupportも使うのですが、1.4.4が必要らしく、現時点で最新の2.0.2が入っているとエラーが出ました。gem cleanupをしなければ1.4.4も使えるはずなのですが、面倒なので2.0.2は削除しました。

> sudo gem uninstall activesupport -v 2.0.2
> sudo gem install activesupport -v 1.4.4

database.ymlにデータベース関係の記述を行うのですが、ただmerbプロジェクトを生成しただけでは同梱されていないのでサンプルを出力させます。

> script/generate migration new_migration

generateするとまずdatabase.ymlを探し、なければサンプルdatabase.sample.ymlを出力します。適当に改変してリネームしてください。ちなみにnew_migrationの部分はマイグレーションの名前ですのでお好きにどうぞ。どうせdatabase.ymlを記述するまで意味がありませんけど。標準ではMySQLのものが出てきます。PostgreSQLSQLiteに合わせた出力が出きるのかは謎です。
database.ymlを記述し終えたら再度上のコマンドを実行します。上の通りに実行するとこうなりました。

> Using pure ruby JSON lib
> Started merb_init.rb ...
> Connecting to database...
> Thu, 03 Jan 2008 18:51:31 GMT: loading gem 'merb_activerecord' from config/dependencies.rb:16 ...
> Loading Application...
> Compiling routes..
> Loaded DEVELOPMENT Environment...
> create schema/migrations
> create schema/migrations/001_new_migration.rb

あとはschema/migrations/001_new_migration.rbにRailsと同じ感じで記述していけばいいだけっぽい。処理するのはActiveRecordだからRailsやってる人ならすぐ分かるはず。

SQLiteで使えるかやってみた

使うのはActiveRecordなのでdatabase.ymlの中身はRailsと同じでいいかなー、なんて思って流用してみたのですが、ほぼそのまま使えました。development環境だけですが、以下に抜粋します。

:development: &defaults
 :adapter: sqlite3
 :database: db/development.sqlite3
 :timeout: 5000

自動でディレクトリを掘ってはくれないので、もし存在しないディレクトリに突っ込む場合には自分でディレクトリを掘っておく必要があります。初め"could not open database: unable to open database file"とrakeに怒られて、development.sqlite3を準備しないといけないのかと思いました。ディレクトリを掘ったらdevelopment.sqlite3は作ってくれたので、面倒ならプロジェクトのトップディレクトリにそのまま置いてもいいかも。

コントローラー

script/generate controller new_controller

まだREADMEあんまり読んでないからよく分からない。

ここまでの印象

思っていたよりも難しくなさそうなイメージ。まだそこまでいじり倒していないのでRailsとの比較はできませんが、Railsみたいに情報がたくさんあるって訳ではないのはちと辛い。結構手探り状態だけど、READMEを読みつつやってみます。

あ、明けましておめでとうございます。今年もまったり更新していきますので、よろしくお願いいたします。