[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と悲惨なことになるけど、これはどうしようもない・・・