鶏肉がいいよね。

プログラミングのハマりどころメモ

Railsアプリを実行ファイル(EXE)にして ローカルアプリとして動かす マトメ

その1〜その3までを踏まえてまとめてみます。
まず環境

rubyのインストール、railsのインストールは省略。

sqlite3ライブラリのインストール
C:\WORK>gem install sqlite3-ruby -v 1.2.3

sqlite3-ruby 1.2.4はエラーが出るかも。

railsアプリの作成

ここはさくっと。

C:\WORK>rails LocalApp

スケルトンを作成

C:\WORK>cd LocalApp
C:\WORK\LocalApp>ruby script/generate scaffold user name:string birthday:date created_at:datetime updated_at:datetime

maigrationする

C:\WORK\LocalApp>rake db:migrate

動作確認

C:\WORK\LocalApp>ruby script/server

ブラウザで確認OK

外部ライブラリのインストール

アーカイブを作るタメのtar2rubyscriptをインストール。gemでインストールは

>gem install tar2rubyscript 

EXEを作るタメのrubyscript2exeをインストール。gemでインストールは

>gem install rubyscript2exe
railsに手を加える

exe化したときにDBは外出しにして扱いたいので以下の記述をRAILS_ROOT/config/environment.rbの先頭に追加

module Rails
  class Configuration
    def database_configuration
      conf = YAML::load(ERB.new(IO.read(database_configuration_file)).result)
      if defined?(TAR2RUBYSCRIPT)
        conf.each do |k, v|
          if v["adapter"] =~ /^sqlite/
            v["database"] = oldlocation(v["database"]) if v.include?("database")
            v["dbfile"]   = oldlocation(v["dbfile"])   if v.include?("dbfile")
          end
        end
      end
      conf
    end
  end
end

DBを外出しするためdatabase.ymlのdatabaseパスを変更する。

# SQLite version 3.x
#   gem install sqlite3-ruby (not necessary on OS X Leopard)
development:
  adapter: sqlite3
  #database: db/development.sqlite3
  database: development.sqlite3
  pool: 5
  timeout: 5000
 #(以下略)
init.rbの作成

exeを実行したときの初期化スクリプトです。
init.rbの名前でRAILS_ROOT直下に配置する。

at_exit do
  require "irb"
  require "drb/acl"
  require "sqlite3"
end
load "script/server" #webrickを使います。
railsアプリをアーカイブ
C:\WORK>tar2rubyscript LocalApp
Creating archive...
Creating LocalApp.rb ...

LocalApp.rbができる。DBをRAILS_ROOT/db/development.sqlite3をカレントにコピーして
ので実行して動作確認

C:\WORK>ruby LocalApp.rb
=> 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-03-29 17:17:52] INFO  WEBrick 1.3.1
[2009-03-29 17:17:52] INFO  ruby 1.8.5 (2007-06-07) [i386-mswin32]
[2009-03-29 17:17:52] INFO  WEBrick::HTTPServer#start: pid=128 port=3000

ブラウザで動作確認OK。

アーカイブをEXEにする!

LocalApp.rbをexeにします。

C:\WORK>rubyscript2exe LocalApp.rb
Tracing LocalApp ...
=> 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-03-29 17:23:39] INFO  WEBrick 1.3.1
[2009-03-29 17:23:39] INFO  ruby 1.8.5 (2007-06-07) [i386-mswin32]
[2009-03-29 17:23:39] INFO  WEBrick::HTTPServer#start: pid=912 port=3000
[2009-03-29 17:23:45] INFO  going to shutdown ...
[2009-03-29 17:23:45] INFO  WEBrick::HTTPServer#start done.
Exiting
Gathering files...
Copying files...
Creating LocalApp.exe ...

途中init.rbが読み込まれるのでwibrickが起動します。Ctrl-Cで止めて、処理を続行させる。
で、LocalApp.exe完成。
最終的には以下のような構成になった。

work/
   ┣ LocalApp(Rails)/
   ┃            ┣app/
   ┃            ┣config/
   ┃            ┣init.rb
   ┃            (以下略)
   ┃
   ┣ dvelopment.sqlite3
   ┣ LocalApp.rb
   ┗ LocalApp.exe

でLocalApp.exeをダブルクリックで起動してみるとwebrickが起動します。ブラウザで動作確認OK。

ちなみに、ログはというと、WindowsユーザのLocal Settings\Tmep\にアーカイブが展開されて保存される。

後は、exeファイルとDBファイルをセットで配布すれば、
rubyがインストールされていないwindowsマシンでもrailsが動作します。