WindowsでRubyで作ったGUIのEXEを配布するときにlibuiを使う場合のメモ


メモ書き的な内容ですみません。機会があったら拡充します。この情報だけだと単なるヒントという感じなので、わからない部分は都度ググってください(書いた人も、試したら出来たから記事にして忘れないようにメモするという状態です)

はじめに

 Rubyでプログラミングを覚えた後、GUIでWindows向けのツールを作成して、配布してみたいと思う方は結構いると思います。でも実際にはパーフェクトな方法がないのが現状です。

2021-03-15 追記

今でもこの記事を見ている人が割といるようなので宣伝。この記事に出てくるlibuiとは別に、自前でLibUIというGEMを作りました。こちらは下に書いてあるような工夫をしなくても、すぐに使うことができるようになっています。この記事の内容は少し古いです。何か問題がありましたら下のリポジトリのissueまでお寄せください。日本語でも構いません。

ocra

 まず、RubyのインストールされていないWindows環境でRubyを動かすとなったときに、Ocraというツールを使うことが多いと思います。

ocraはRuby処理系全体を圧縮してEXEファイルに詰めてしまい、Rubyを実行する際にはRuby処理系を解凍してそれを実行すると聞いています。(詳しいことはわかりません)Ruby処理系と一緒にGUIツールもocraでEXEの中に詰め込む必要があります。

 では、どのGUIツールキットを同封するか、という話になります。以前ならTkをお勧めしていたのですが、TkがRuby標準ライブラリから切り離されてしまった今、積極的にTkを勧める理由が以前に比べると薄くなってきたのかなという気がします。gtk2というのも鉄板ですが、いまさらversion2なのは気になります。そもそもgtkは重いのでOcraに詰め込むのは向いていないです。かといってjrubyは使いたくないですし。

libui

 そこでもっと軽量なライブラリとなるとlibuiが候補に挙がります。

libuiは、リリースページからバイナリを配布しているので、これをダウンロードしてきます。libuiのRubyバインディングは

です。しかし、Gemが十分に整備されていなくてそのままではlibui.dllを認識してくれないので、適当にソースコードを書き換える必要があります。またgemspecファイルもないのでインストールするのも面倒ではあります。

さて、gem install libui-ruby で libuiをインストールしたとして、libui.dllをソースコードと同じ位置に配布して、ext.rbを適当に書き換えて読み込めるようにしておきます。

ext.rb
    ffi_lib File.expand_path("libui.dll", __dir__)

みたいな感じですかね。

これで試しにexampleのcontrol_gallery.rbをEXE化してみましょう。

cd example # https://github.com/andlabs/libui
ocra .\control_gallery.rb --dll ruby_builtin_dlls\libssp-0.dll

とします。おそらく実行ファイルができるはずです。自動的にffiなど必要なgemを検出していますね。
--dll ruby_builtin_dlls\libssp-0.dll は、libssp-0.dllがありませんとかいうエラーが出るので、これをつけて回避した痕跡なので、エラーが出なければなくてもかまいません。

このファイルは2544KBと、RubyのEXEとしてはまあまあ小さなサイズで、なおかつGUIが起動します。起動が遅くね?と思うかもしれませんが、ぶっちゃけTkやGtkをocraで詰め込むのと比較したらすごく高速です。サイズが大きくなってもかまわないならno-lzma(無圧縮)オプションでさらに高速にすることもできると思います。

一応、WindowsからRuby処理系を削除して、それでも起動することを確認したので、これで配布可能だと思います。

この記事は以上です。