前回の続きです。
今回はRailsアプリを1ファイルにアーカイブします。
調べた結果、アーカイブするには以下しか見当たりませんでした。
- Tar2RubyScript
gemでインストールは、"gem install tar2rubyscript"で。使い方は
>tar2rubyscript ディレクトリ名単体で使う場合はtar2rubyscript.rbの直接起動します。
詳しい手順はこちらやこちら(日本語wiki)で紹介してます。この手順をざっくりと追っていきます。
必要なものは以下のようです。
- SQLite (今回はSQLite3)
- Rails アプリ
- Tar2RubyScript(tar2rubyscript.rb)
- RubyScript2exe(rubyscript2exe.rb)
実際に手順を追います。
SQLiteとRailsのところは前回に済ませているので省略。で次。
config/environment.rbの一番先頭に以下のmoduleを追記します。
sqliteのdbファイルを絶対パスで取得する為にRails::Configuration#database_configurationをオーバーライドさせる必要があるみたいです。
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
次、Tar2RubyScriptはinit.rbが必要らしいので以下コードのinit.rbをRails_ROOTに配置します。
at_exit do require "irb" require "drb/acl" require "sqlite3" end load "script/server" #webrickを使います。
ここまでのディレクトリ構成は以下のようになります。
work/ ┣ LocalApp(Rails)/ ┃ ┣app/ ┃ ┣config/ ┃ ┣init.rb ┃ (以下略) ┃ ┣ tar2rubyscript.rb ┗ rubyscript2exe.rb
で、次にtar2rubyscript.rbを使ってLoacalAppを1ファイルにまとめます
C:\WORK>ruby tar2rubyscript.rb LoacalApp tar2rubyscript.rb:623:in `replace': can't modify frozen string (TypeError) from tar2rubyscript.rb:623 from tar2rubyscript.rb:577:in `newlocation' from tar2rubyscript.rb:505:in `newlocation' from tar2rubyscript.rb:472:in `newlocation' from tar2rubyscript.rb:505:in `newlocation' from tar2rubyscript.rb:577:in `newlocation' from tar2rubyscript.rb:621
エラー。どうもrubyのバージョン?かよくわからんが、
tar2rubyscript.rbの623行目あたりの
#$0.replace(File.expand_path("./init.rb")) $0 = File.expand_path("./init.rb")
に修正します。
C:\WORK>ruby tar2rubyscript.rb LocalApp Creating archive... Creating SalaryMan.rb ...
うまく行きました。
カレントディレクトリにLocalApp.rbというrailsアプリのアーカイブファイルLocalApp.rbができています。
ためしにこいつでLocalAppを起動してみます
C:\WORK>ruby LocalApp.rb LocalApp.rb:605:in `replace': can't modify frozen string (TypeError) from LocalApp.rb:605 from LocalApp.rb:559:in `newlocation' from LocalApp.rb:487:in `newlocation' from LocalApp.rb:454:in `newlocation' from LocalApp.rb:487:in `newlocation' from LocalApp.rb:559:in `newlocation' from LocalApp.rb:603
またしてもreplaceでエラー。こいつもtar2rubyscript.rb
同様に
#$0.replace(File.expand_path("./init.rb")) $0 = File.expand_path("./init.rb")
します。再度実行。
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-28 04:43:22] INFO WEBrick 1.3.1 [2009-03-28 04:43:22] INFO ruby 1.8.6 (2008-08-11) [i386-mswin32] [2009-03-28 04:43:22] INFO WEBrick::HTTPServer#start: pid=3376 port=3000
webrickが起動しました。実際に動作確認します。
動いてそう。OK。
このアーカイブファイルをexeに形式にコンバートしてみます。
続きはまた次回。
でも実はtar2rubyscriptで出たエラーは、会社のマシンでは出なかった。かなりrubyのバージョンに依存している?
rubyリファレンス見る限り,1.8以降はARGVの要素はfreezされているみたいだが。。。よくわからん。