Sinatraを試してみたけどそんなにすんなりいかなかった。(すぐに解決したけど)

前から気になっていた軽量フレームワーク"Sinarta"。
評判がいいので自分も試してみました。
Rubyの軽量Webフレームワーク「Sinatra」がステキ - このブログは証明できない。に最小限のサンプルコードが良くまとまっているのでこれを見ながら試してみました*1がちょっと戸惑う点があったのでまとめてみました。

sinatra-0.9.2だと普通に実行するだけでエラーになる。

普通にインストール。

gem install sinatra

sinatra-0.9.2がインストールされます。
まずは一番シンプルなサンプルを実行してみました。

require 'rubygems'
require 'sinatra'

get '/hi' do
  "Hello World!"
end

エラー。

c:/ruby-1.8/lib/ruby/gems/1.8/gems/sinatra-0.9.2/lib/sinatra/base.rb:930:in `detect_rack_handler': Server handler (thin,mongrel,webrick) not found. (RuntimeError)
from c:/ruby-1.8/lib/ruby/gems/1.8/gems/sinatra-0.9.2/lib/sinatra/base.rb:862:in `run!'
from c:/ruby-1.8/lib/ruby/gems/1.8/gems/sinatra-0.9.2/lib/sinatra/main.rb:34
from first.rb:10

エラーメッセージで検索してみると解決策がすぐに見つかりました。以下のように書き換えると解決。

require 'rubygems'
require 'sinatra'
Rack::Handler.register 'Webrick', 'Rack::Handler::WEBrick' #ここを追加する

get '/hi' do
  "Hello World!"
end

ソースコードの引用元のSinatraを0.9.2にupdateするとWEBrickで動作しなくなった - うなの日記によると、Sinatraのバグではないかとのこと。
githubにあがっている最新のソースを見ると、指摘された部分はすでに修正されているようでした*2。なんで新しいのがgemでインストールされないのか疑問ではありますが一応解決。

別途hamlのインストールが必要

hamlのサンプルを試してみました

require 'rubygems'
require 'sinatra'

Rack::Handler.register 'Webrick', 'Rack::Handler::WEBrick'

get '/' do
  haml :index
end

__END__

@@ layout
%html
  = yield

@@ index
%div.title Hello world!!!!!

エラー。

[2009-06-29 18:47:03] INFO WEBrick::HTTPServer#start: pid=384 port=4567
Auto-require of Haml is deprecated; add require 'Haml' to your app.
LoadError - no such file to load -- haml:
c:/ruby-1.8/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require'
c:/ruby-1.8/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `require'
first.rb:13:in `GET /'
(以下略)

別途、hamlをインストールしないとダメだった。そりゃそうか。

gem install haml

これで解決。

ソースを書き換えたときには再起動が必要

ソースコードを書き換えたときにはプログラムを再起動しないと変更が実行結果に反映されません。*3 *4これも当然と言えば当然ですが、Railsの感覚だとちょっと戸惑うかも。


このように少し戸惑いはしましたが、Sinatraはいいですね。ファイル数とコードの分量が少なくて済む所が気に入りました。*5

*1:環境はWindows Vistaruby 1.8.7 (2008-08-11 patchlevel 72) [i386-mswin32]です

*2:http://github.com/sinatra/sinatra/blob/38f6619b960bb3d72517d78cda9bb0bc5084121f/lib/sinatra/base.rb#L922

*3:少なくともデフォルトのWeblickで実行された場合は。

*4:Viewファイルの変更は再起動しなくても反映されます。

*5:必要に応じて分割できるところも