トップ 検索 一覧 差分 ソース ヘルプ RSS ログイン

wxRuby + Exerb 2009

wxRuby + Exerb 2009

最初、この記事ではRuby自体の紹介から始まる能書きを色々書いていたが、それらはやめることにした。

Windows上でwxRuby+Exerbで実行ファイル(.exe)を作りたいというRuby初学者の人がググって来てくれればいいやということで。

RubyにはExerb, RubyScript2Exe, OCRAなどいくつかその手のツールがあるが、日本では圧倒的にExerbの使用者が多いだろう。しかし、ExerbはRubygemsと相性が悪いらしく、筆者の手元ではいくらか工夫をしないと、最新のwxRuby+Exerbは実現できなかった。そして、(Ruby使いにはそれなりのエキスパートが多く自己解決しているからかもしれないが)ネット上にその情報が少ないようなので、ここにメモを残すことにした。

 構築する環境

この記事では、Ruby実行環境がない状態からActiveRuby(Active Script Ruby) 1.8.7.11-p174-winsock2(exerb 5.0.0を含んでいる)とwxRuby 2.0.1で実行ファイルを作成するまでを追う。

手順は、途中でrubygemsの関連をどのように扱うかで2つに分かれる。レシピファイルと最終的な.exeにrubygemsごと含んでしまうお手軽コースと、あくまでwxRubyのみを含める無理矢理コースだ。この記事では最初、無理矢理コースのみ紹介していたが、掲示板でご指摘を頂いたのでお手軽コースも掲載することにした。

なお、筆者の試した環境はWindows XP Professional SP3だ。他のOSの場合は適宜読み替えて欲しい。

 手順

コマンドプロンプトの操作と環境変数の設定くらいはできるものとして書いているので注意。

ActiveRubyのインストール

ActiveRuby 1.8.7.11-p174-winsock2をダウンロードし普通にインストール。これにはexerb-5.0.0を含んでいる。

安定版を使用しないのは、Exerbが古いため。もしかしたら安定板ならこの記事のような変な手順は不要なのかもしれないが。

なお、ActiveRubyはコマンドプロンプト用にパスを通してくれないので、

C:\Program Files\ruby-1.8\bin

に自分でパスを通しておくこと。

wxRuby2のインストール

コマンドプロンプトを開き、以下の通り実行。

gem install wxruby

なお、ruby1.9系列では

gem install wxruby-ruby19

としなければならないかも知れない。

本来、gemを使用せずにwxRubyをインストールすれば、この記事のような手順は不要なはずだ。しかしwxRubyを手動でインストールするには、wxWidgetsを自分で用意しなければならないなど手間が掛かりすぎるようなので、観念してgemに頼った。筆者自身はwxWidgetsのビルドを何度も行っているが、それを解説するとこの記事の殆どをそれに費やすことになってしまう。

実はwxRubyにはOne-Click-Installerベースの総合パッケージが用意されており、本当はこれでruby1.9系列で使用したかったのだが、肝心のExerbが1.8.7ベースなのでこれも諦めた。Exerbは自前のRubyエンジンとユーザスクリプトを合わせて.exe化するため、ExerbのRubyエンジンとユーザ環境のRubyエンジンのバージョンを合わせないと、環境の相違による動作の違いに悩まされることになる。ひどい場合にはまともに起動すらしない。

特にwxRuby側が、同じwxRuby2.0.1でもRuby1.8系列と1.9系列では内容が異なるため、ユーザ環境のRubyが1.9系列だとExerb自前の1.8系列Rubyエンジン上で1.9系列用のwxRubyを動かすことになってしまう。自分でExerbを1.9系に対応させれば問題は解決するが、余りに手間が掛かりすぎるだろう。

どうしてもRuby1.9系列でwxRubyを使用し.exe化を行いたい方は、wxRuby + ocra 2009を参照のこと。

次の手順は最初に述べた通り、お手軽コースと無理矢理コースに分かれる。とりあえずwxRubyを試したいだけの方はお手軽コースを、あくまでムダなく行きたい方は無理矢理コースを選択するとよい。

お手軽コース:wxRubyとgemsを両方含める

アプリケーションをapp.rbと仮定する。app.rbのディレクトリでコマンドプロンプトを開き

mkexy -Ku -rrubygems app.rb

としてapp.exy(レシピファイル)を作成する。-Kuはapp.rbがUTF-8N(BOMなしUTF-8)の場合。Shift_JISの場合は-Ks、EUC-JPの場合は-Ke。

この場合、rubygemsがレシピファイルに追加され、最終的な実行ファイル(.exe)にも含まれる事になる。実行ファイルのサイズが少々大きくなるが、他にもgems経由で使用したいライブラリがある場合には、無理矢理コースよりもこちらのほうが便利だ。

無理矢理コース:wxRubyをgems非依存にする

RubygemsとExerbは相性が悪いので、無理やりRubygemsを経由せずに使えるようにする。あまりよい方法とは呼べないかも知れないが。

C:\Program Files\ruby-1.8\lib\ruby\gems\1.8\gems\wxruby-2.0.1-x86-mswin32-60\lib

にある全てのファイル・フォルダを

C:\Program Files\ruby-1.8\lib\ruby\site_ruby\1.8

に丸ごとコピーする。

蛇足だが、ここでsite_rubyを使用しvendor_rubyにしなかった理由は、Ruby v1.8.7の更新履歴に書かれているvendor_ruby導入の目的にある。これによると、vendor_rubyはActiveRubyやOne-Click-Installerのようなディストリビューションを作る際に、その作成者が添付するライブラリやパッケージを入れる場所と思われる。一方site_rubyは、そのディストリビューションのユーザが自分で自由にライブラリやパッケージを入れるために使用する場所らしい。今回の手順は若干無理矢理の方法ではあるが、我々ユーザが手動でwxRubyを入れるなら、site_rubyに入れるべきだろう。

因みにwxRubyの総合パッケージでもwxRuby自身をsite_rubyに入れているが、この観点から言えば本当はよろしくないことであると思われる。なお、ライブラリの検索順序はディストリビューション付属のものよりもユーザが上書きしたものが優先されるべきなので、site_rubyが優先になる。

閑話休題。この状態で、wxRubyを使用するアプリケーションが

require 'rubygems'

書かなくとも動作することを確認しておくこと。

アプリケーションをapp.rbと仮定する。app.rbのディレクトリでコマンドプロンプトを開き

mkexy -Ku app.rb

としてapp.exy(レシピファイル)を作成する。-Kuはapp.rbがUTF-8N(BOMなしUTF-8)の場合。Shift_JISの場合は-Ks、EUC-JPの場合は-Ke。

Exerbを実行し.exe化

レシピファイルが作成できたら、あとはいよいよ実行ファイル(.exe)を作成する。

exerb app.exy

または、完成したアプリケーションの実行時にコマンドプロンプトを表示させたくなければ

exerb -c gui app.exy

でapp.exeが完成。

なお、文字コードに関してはexerbに-k utf8(またはsjis,euc,none)で指定する方法もあるが、mkexy実行時に文字コードの問題でテスト実行が停止しては困るので、mkexyの時に指定するほうがよいだろう。それがレシピファイルにも反映されるので問題ない。

なお、mkexyとexerbが上手く行かない場合は

C:\wxruby\ruby\bin\

から

  • exerb
  • mkexy

をapp.rbと同じディレクトリにコピーしてきて、以下のようにruby.exeを直接起動して読ませるとよい。

ruby mkexy -Ku app.rb
ruby exerb app.exy

最近のActiveRubyではmkexy/exerbにバッチファイルが用意されているため、恐らくこのような手順は不要だろう。

 おまけ1(.exeのUPXでの圧縮)

今回の手順で作成した、Hello! Worldレベルの.exe(無理矢理コースで作成)は約10.3MiBにもなった。wxruby2.soが巨大なことが原因だが、wxWidgets自体大きなライブラリなのでこれは仕方がない。

有名なUPXを使用して.exeを圧縮すると-9で2915KiB、--bestで2913KiBまで縮んだが、さらにドキュメントやヘルプにはない(もしかしたらまだEXPERIMENTALなのかもしれないが)--lzmaオプションを使用すると2461KiBまで縮んだ。これは7-zip(.7z)形式に採用されているLZMAアルゴリズムを使用するオプションで、最高速設定である-1 --lzmaでも2859KiBと、通常の--bestよりも高速かつ圧縮率が高い。かなり有効なので試してみると良いだろう。

なお、ネット上ではExerbをかける前のライブラリにUPXをかける方法と、完成した.exeにかける方法で情報が割れている。雰囲気を見るに、昔のExerbでは事前にかけるべきであったが、最近(exerb-3.0.0以降?)は事後にかけられるようだ。猫科研究所では事後にかける方法で、特に問題は発生していない。

 おまけ2(工夫してもっと小さく)

この項目は大きすぎたので、wxRuby + Exerb + UPX 2009に分割した。正直、サイズに非常な拘りがなければ、上記の「おまけ1」の方法で十分だと思う。

 リンク集

今回wxRubyとExerbのことを調べた際に集めたリンク。

最終更新時間:2010年02月07日 16時21分56秒