wxRuby + ocra 2009
先日、wxRuby + Exerb 2009を書いたばかりなのだが、ExerbはRuby1.8.7にしか対応していない。どうせならRuby1.9.1を使用したいというのは誰もが思うところ。この記事ではRuby1.9.1 + wxRuby2.0.1 + ocraでWindows上で動く実行ファイル(.exe)を作成する。
とは言っても、この記事の方法ではExerb + Rubygemsのような面倒な問題はない。wxRubyの総合パッケージは、wxRubyが導入済みのRuby実行環境だ。これを利用すればwxRubyのインストールにRubygemsが介入せず、従って素直に.exe化までたどり着ける。Rubyを扱った経験のある方には、何の目新しい情報もない。
構築する環境
この記事では、Ruby実行環境がない状態から、wxRuby2.0.1の総合パッケージ(Ruby1.9.1を含んでいる)とocra-1.1.2で実行ファイルを作成するまでを追う。
なお、筆者の試した環境はWindows XP Professional SP3だ。他のOSの場合は適宜読み替えて欲しい。
手順
コマンドプロンプトの操作くらいはできるものとして書いているので注意。
wxRuby(総合パッケージ)のインストール
何も難しいことはない。wxRubyのサイトからmingw32-ruby-1.9.1-wxruby-2.0.1-setup.exeをダウンロード、実行してインストールするだけ。
ActiveRubyと違い、パスの設定までしてくれるので本当に何もすることがない。
ocraのインストール
どこでもよいので適当にコマンドプロンプトを開き、
gem install ocra
と実行するだけ。
ocraを実行し.exe化
ここだけ、若干の工夫を要する。筆者はwxRubyで日本語を扱わせるために、ソースコードをBOMなしUTF-8(いわゆるUTF-8N)で書いていたが、Rubyが標準でこれを認識してくれない。Exerbのように日本語の文字コードを指定するオプションも無さそうで、困ってしまった。
が、話は簡単。ソースコードをBOM付きのUTF-8にしたところ、認識されて問題なく通るようになった。その昔、BOM付きUTF-8には対応しないと言われていたはずなのだが、どうして通ってしまうのかは不明…。
実行したコマンドラインは以下の通り。
ocra --no-autodll app.rb
そしてコンソールが不要な場合は以下の通り。
ocra --no-autodll --windows app.rb
これで.exeが完成する。ocraはバッチファイル化されているため、rubyにパスが通っていれば普通に使用できるのが楽だ。
ちなみに、オプションの--no-autodllはオプションの解説になく、どういう意味か不明なのだが、これなしでは以下のようにエラーになる。
C:\home>ocra app.rb === Loading script to check dependencies === ERROR: Failed to load the win32-api gem. Install win32-api or use --no-autod ll. === CAUSE: Gem::LoadError: Could not find RubyGem win32-api (>= 1.2.0)
簡単なwxRubyを使用するスクリプトは動作したが、DLLを駆使するようなもっと複雑なものの場合は以下のようにして先にwin32-apiをインストールしたほうが良いかもしれない。
gem install win32-api
なお、ocraのその他のオプションに関してはRubyはじめました: Ocraで、rubyからWindowsの実行ファイル(exe)を作るが詳しい。
おまけ(.exeの圧縮に関して)
Exerbでは出力された.exeをUPXで圧縮可能と書いたが、ocraは勝手に圧縮を行ってくれる。しかも圧縮アルゴリズムはLZMAのようだ。
ただし、Exerbで10.3MiBになりUPX(--lzma)で2461KiBまで縮んだアプリケーションが、ocraでは倍近い4723KiBになった。これはExerbとocraで.exeに含むファイルが異なるせいだ。試しに、ocraで無圧縮(--no-lzma)にしてみると、20.3MiB程度あった。無圧縮状態で倍近いサイズの差があるので、圧縮しても大きな差があるのは当然だ。なお、ocraで無圧縮で出力した.exeをUPXにかけてみたが、上手く圧縮できないようでサイズも縮まらず実行もできない.exeになった。
このあたりは、Exerbの方が一日の長があるのかもしれない。実際の動作上も、Exerbの方が複雑だが賢い方法(requireをオーバーライドするなど)を使っている。もちろん日本語に関する配慮もExerbの方がよい。Ruby1.9系列に拘らず、かつRubygemsの問題を自力で乗り越えられるのであればExerbの方がお勧めだ。逆にRuby1.9系列が必要であるか、Rubygemsの問題を回避したいのならocraがお勧めになる。ただ、20MiB以上の.exeになってしまうwxRubyで使用するのは、若干抵抗がある…。
おまけ2(Ruby1.8.7でのocraについて)
実は、wxRuby + Exerb 2009を書いた際にもocraには挑戦していたのだが、そのときはActiveRubyの1.8.7の環境で実行し、ocraが実行できない(ocraの本体であるocra.rbが見つからないというエラーが発生)でいた。もうそれ以前にExerb + Rubygemsでさんざん苦労していたため、その時は原因を追う気がせず諦めた。
その後、何の気なしに検索をかけたところ、該当情報があっさり見つかった。ruby1.8系のocraが動かない - mirichiの日記を参照して欲しいが、要は二重引用符によるクォートのせいで読み込めないだけで、<ruby>/bin/ocra(最初に実行されるスクリプト)の最後の行で、以下のようにして二重引用符を取り除けばOKらしい。
load Gem.bin_path('ocra', 'ocra.rb', version)[1..-2]
また、Route 477 - Rubyスクリプトをexe化するためのソフト、Ocraによるとwin32-apiのインストールが必須らしいので注意。
先人に感謝。
最終更新時間:2009年11月13日 03時20分39秒