昨年のRailsカンファレンスに続いて今年のRailsカンファレンスでは、「IronRuby on Rails」というセッションが行われました。このセッションでは、公開されたIronRuby 0.5.0とRuby on Rails 2.3.2を使って実際にRailsをIronRubyで動かしています。少し(大分かも)前から、IronRubyでRailsを動かすためのドキュメントが公開されています。このカンファレンスで何を紹介したかというサマリーが、Jimmyさんのブログで紹介されています。Railsを動かすドキュメントを使って、実際にRailsを動かしてみましたので、その手順を以下に記載していきます。
1.環境構築
IronRuby 0.5.0をダウンロードしてC:\IronRuby-0.5.0フォルダへ展開し、OneClick Installerで使ってC:\RubyへRubyをインストールしました。
2.Rails 2.3.2 の導入
#コマンドプロンプトで作業 gem update --system gem install rails --v2.3.2 --include-dependencies
(注)RubyGemsを利用するために、Ruby 1.8系が必要になります。
3.環境変数の設定
SET PATH=%PATH%;C:\IronRuby-0.5.0\bin SET GEM_PATH=C:\ruby\lib\ruby\gems\1.8
4.IronRubyの構成ファイルである「ir.exe.config」のLibralyPathsの値にRuby1.8のライブラリパスを設定します。
<set language="Ruby" value="..\lib\IronRuby; c:\ruby\lib\ruby\site_ruby\1.8\; c:\ruby\lib\ruby\1.8\" option="LibraryPaths" />
(注)valueの値は読みやすいように改行していますが、実際に設定する場合は改行を含めないで下さい。またir.exe.configは、IronRuby 0.5.0を展開した中のBinサブフォルダに存在します。
4.SQL Server のActiveRecord Adapter の導入
(注)もちろん、SQL Serverをインストールしておく必要があります。私の場合は、SQL Server 2008 Express Editionで確認を行いました。このアダプターでは、以下のようなデータ型の対応付けが行われています。
:primary_key => "int not null identity(1,1) primary key ", :string => { :name => "varchar", :limit => 255 }, :text => { :name => "text" }, :integer => { :name => "int" }, :float => { :name => "float" }, :decimal => { :name => "numeric" }, :datetime => { :name => "datetime" }, :timestamp => { :name => "datetime" }, :time => { :name => "datetime" }, :date => { :name => "datetime" }, :binary => { :name => "varbinary", :limit => 'MAX' }, :binary => { :name => "image" }, :boolean => { :name => "bit" }
5.WEBrickに対するパッチを投入します
パッチの内容は、2か所あります。最初に、163行目のHttpRequestクラスのto_sメソッドです。
# ret = @request_line.dup # @raw_header.each{|line| ret << line } ret = @request_line ? @request_line.dup : "" @raw_header.each{|line| ret << line } if @raw_header
# IronRuby bug: IO#read seems to chop off the first char class TCPSocket def read size recv size end end
6.Railsからエンコード指定を取り除きます。2.3.2のRailsはデフォルトがUTF-8のエンコーディングです。が、IronRubyではUTF-8エンコーディングの文字列が組み合わさるとバグが発生するためです
ここまでで、準備が完了です。ここからは、Railsアプリケーションを作成していく作業となります。
7.新しいRailsアプリケーションを作成します
(注)成功すれば、コマンドプロンプトに「create ....」というログが表示されます。IronRubyでは、各種のコマンドの先頭に「i」というプレフィックスが付きます。インタラクティブRuby(irb)なら、「iirb」となります。これらのコマンドは、Windows向けにはBATファイルがあり、Linux向けには拡張子無しのシェルスクリプトファイルが提供されています。
8.データベースの設定を行います
development: adapter: mssql host: (local)\SQLEXPRESS database: ironruby_dev integrated_security: true
上記のように設定するか、host、database、integrated_securityパラメータを「connection_string」パラメータで置き換えます。
続いて「ironruby_dev」という名前のデータベースをSQL Serverで作成します。SQL Server 2008 Management Studio Expressを使用するのが簡単です。 (注)このパラメータ形式は、SQL Serverをご存じな方には馴染み易いことでしょう。ADO.NETなどで、指定する接続文字列をパラメータとして指定しているのです。
9.Scaffolding を使ってサンプルのアプリケーションを作成します
(注)成功すればコマンドプロンプトに「create....」というログが表示されます。
10.アプリケーションコントローラーのバグ対応を行います。
class PostsController < ApplicationController ... ... # 私の場合は、最後に追加しました public :default_url_options end
(注)この変更は、IronRubyのバグ1354に対する対応です。rails 2.3.2では、default_url_optionsメソッドがprotectedとして定義されています。IronRubyでは、publicである必要があります。publicに変更しないでWEBrickを起動すると、http リクエストに対するレスポンスが帰ってきません。default_url_optionsメソッドのエラーがコンソールに出力される場合もあります。
11.データベースのテーブルを作成します
C:\IronRubyOnRails>irake db:migrate (in C:/IronRubyOnRails) == CreatePosts: migrating ================= -- create_table(:posts) -> 0.0550s -> -1 rows == CreatePosts: migrated (0.0990s) ========
C:\IronRubyOnRails>irake db:migrate (in C:/IronRubyOnRails) rake aborted! rake aborted! mscorlib:0:in `GetBytes': 値が有効な範囲にありません。 (System::Text::EncoderFallbackException) from :0:in `write' from :0:in `puts' .....
11.WEBrickを起動してテストを行います
C:\IronRubyOnRails>ir script/server => Booting WEBrick => Rails 2.3.2 application starting on http://0.0.0.0:3000 => Call with -d to detach => Ctrl-C to shutdown server [2009-06-09 17:14:17] INFO WEBrick 1.3.1 [2009-06-09 17:14:17] INFO ruby 1.8.6 (2008-05-28) [i386-mswin32] [2009-06-09 17:14:17] INFO WEBrick::HTTPServer#start: pid=4568 port=3000
正常に起動すれば、上記のようなログが出力されます。しかしながら、私の環境(Windows Vista with SP2)では少し時間がかかります。
Processing Rails::InfoController#properties (for 127.0.0.1 at 2009-06-09 17:21:5) [GET] Completed in 584ms (View: 189, DB: 0) | 200 OK [http://localhost/rails/info/proerties] Processing PostsController#index (for 127.0.0.1 at 2009-06-09 17:25:21) [GET] Rendering template within layouts/posts Rendering posts/index Completed in 735ms (View: 540, DB: 0) | 200 OK [http://localhost/posts]
ここまでの動作で、IronRubyを使ってRuby on Rails 2.3.2が動作していることを確認することができました。データベースとしては、SQL Serverです。まだまだパフォーマンス的な問題や、バグが残っているにしてもIronRubyによる Ruby on Railsの実現が近くなってきたのを感じ取ることができます。是非、皆さんも試してみてください。そしてバグを見つけたら、フィードバックをしてください。
PS.昨年のRailsカンファレンスでもIronRubyでrailsを動かしていますが、日本では情報が少ないように感じています。是非、皆さんも動かしてみてください。
追記:WEBrickへのパッチを投入するファイル名を追加しました。
はじめまして
IronRubyでRailsをと思い、ironruby-050をダウンロードし、Cは以下へ移動させ、ir.exeを実行したところ
”問題が発生したため、Ruby Consoleを終了します。”となり起動に失敗してしまいました
実行環境の問題と思うのですが、何かヒントなどあれば、是非教えていただけないでしょうか?
・.net frameworkは 2.0、3.0、3.5spが入っています
反応が遅くて、ごめんなさい。
このケースですが、http://ironruby.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=25902のIronRuby-0.5.0でしょうか。間違って、CTP for .NET 4.0 Beta 1を動かすと同じような問題が発生します。それでも解決しない場合は、ironruby-0.5.0-srcを使ってビルドしてみては如何でしょう。
あ、もしかして「ir.exe」のみをC:\へ移動されたりしていますか? もしそうなら、ironruby-0.5.0.zipをディレクトリ付きで展開してできるBinサブディレクトリの中でir.exeを実行してみてください。このケースであれば、IronRubyの実行に必要なモジュールが不足しているためだと思われます。IronRubyの実行に必要なファイルは、以下の9種類になります。
ir.exe
ir.exe.config
IronRuby.dll
IronRuby.libraries.dll
IronRuby.libraries.Yaml.dll
Microsoft.Scripting.dll
Microsoft.Scripting.Core.dll
Microsoft.Scripting.ExtensionAttribute.dll
Microsoft.Dynamic.dll
ご連絡ありがとうございます
下のIronRuby-0.5.0です、
http://ironruby.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=25902
またディレクトリごとC:\へ移動し、bin配下に上記必要なファイルがある状態で、ir.exeをクリックした結果、失敗となります
ソースからのビルドは実施してみましたが、ダメでした
試しに、他の人に同ファイルで、試して頂いた結果、正常に動いている事を確認できました
やはり自分の環境依存のようです、、、、
との状況ですので、何か解決となるヒントでもと思い投稿させて頂きました
環境依存と思われますので、難しいですね・・・・
他の方も動作しているとなると、環境依存と言えばそうなんですが、参照しているアセンブリが見つからなかった場合にこのエラーが良く発生します。つまり、.NET FrameworkのmscorlibやSystem.Coreなどです。Visual Studioなどをお持ちであればエラーが発生した場合にデバッガを起動して、何のアセンブリを読み込む時にエラーが出ているかを調べることができます。特に.NET Frameworkのランタイム系が、正しく読み込めていない可能性が高いです。
VSでビルドされたのであれば、参照アセンブリを削除されてからもう一度アセンブリ参照を行ってビルドしなおすのも1つの手です。
それからセキュリティでブロックされている可能性も考えられます。ダウンロードしたZIPを私の場合は、ブロックの解除をしてから展開しています。これをしておかないと、展開したファイル自体もブロックされていますので、実行時にネットワーク接続が発生してファイアーウォールなどにブロックされることもあります。