[QtRuby] QtRubyで作ったをスクリプトのEXE化に挑戦してみた
Rubyで作ったスクリプトを実行ファイルにする場合、今まではExerbというツールを使ってexe化していた。ただ、Exerbには欠点があって、
- 実行ファイルなのに、コードが容易に見られてしまう(ハズカシイ(/ω\))
- 外部ライブラリを使うと(設定がまずいだけな気がするが)上手くexe化出来ない。
案の定、QtRubyで作ったスクリプトをExerbで変換すると、上手くexe化出来なかったので、別のツールを試してみることにした。
1. Ocraのインストール
Ocraというツールで実行ファイルを作れるらしいので試してみた。
インストールはいつものようにgemで行う。
$ gem install ocra
使い方も簡単で、こんな感じにスクリプトファイルを指定するだけ。
$ ocra helloworld.rb
"Hello World."を標準出力に出力する程度でも、実行ファイルの容量は450KB程度になるが、そこは致し方なし。
2. まずは普通にやってみる
Ocraのインストールが終わったので本題。
やりたいのはQtRubyで作ったスクリプトのexe化ってことで、サンプルは次のスクリプト。
helloworldGUI.rb
require 'qt4' exit if defined?(Ocra) app = Qt::Application.new(ARGV) w = Qt::Label.new("Hello World.") w.show app.exec
Ocraはexe化の際、使用しているライブラリ等を判別するため、一度スクリプトを実行させているらしい。
変換前にスクリプトを実行するので、GUIがあると変換の際ウィンドウを閉じる必要がある。
2行目は、このメンドクサイ作業をやらなくてすむようにしている。
これを先と同様にOcraで実行ファイルと作って実行すると次のようなエラーが出る。
$ ocra helloworldGUI.rb $ helloworldGUI.exe xxxxx/src/helloworldGUI.rb:1:in `require': no such file to load -- qt4 (LoadError)
つまり、QtRubyが見えていないっぽい・・・
QtRubyにパスが通ってないとかそんな初歩ミスはやらかしていない。
3. $LOAD_PATHを確認する
ってことで、$LOAD_PATHを確認してみる。
特に上手い方法も知らないので、普通にやる。
confirm_LoadPath.rb
exit if defined?(Ocra) puts $LOAD_PATH
まずはこれを普通に実行して、念のため、QtRubyへのパスが通っていることを確認する。
$ ruby confirm_LoadPath.rb [Rubyフォルダ]/lib/ruby/gems/1.8/gems/qtruby4-2.1.0-x86-win32/lib :
って感じで、QtRubyへのパスが通っていることが確認できる。
次のこれをOcraでexe化して、作成された実行ファイルを実行してみる。
$ ocra confirm_LoadPath.rb $ confirm_LoadPath.exe [TMPフォルダ]/lib/ruby/site_ruby/1.8 [TMPフォルダ]/lib/ruby/site_ruby/1.8/i386-msvcrt [TMPフォルダ]/lib/ruby/site_ruby [TMPフォルダ]/lib/ruby/vendor_ruby/1.8 [TMPフォルダ]/lib/ruby/vendor_ruby/1.8/i386-msvcrt [TMPフォルダ]/lib/ruby/vendor_ruby [TMPフォルダ]/lib/ruby/1.8 [TMPフォルダ]/lib/ruby/1.8/i386-mswin32
こんな感じで表示される。
パスがTMPフォルダ内に変わっているのはOcraの仕様として、QtRubyへのパスが含まれていないのがわかる。
$LOAD_PATHにQtRubyが含まれていないので、require 'qt4'でLoadErrorになるという塩梅・・・
4. さて、どうしよう・・・
無い知恵絞ってみたけど、Rubyに精通しているわけでもないので、泥臭い方法しか思いつかなかった・・・
つまり、requireされる'qt4'をカレントにしてしまえばいいんだよってことで、
"[Rubyフォルダ]/lib/ruby/gems/1.8/gems/qtruby4-2.1.0-x86-win32/lib"フォルダにhelloworldGUI.rbを移動し、ここで、
$ ocra helloworldGUI.rb
を実行。
当然、exe化は成功しましたとさ・・・
5. おわり
実行ファイルは作れたけど・・・なんか違う・・・
もっとスマートなやり方があれば・・・
ちなみに実行ファイルのサイズは20MBと悲惨なことになるけど、これはどうしようもない・・・