RubyスクリプトをWindowsの実行ファイル(バイナリ)として配布することが簡単にできました!
せっかく作ったプログラムをみんなに使ってもらいたいですよね?
大好きなRubyで作ったプログラムは、これまでRubyインタプリタをセットアップしている人にしか使ってもらうことができませんでした。これは非常に残念なことです。
Ruby1.8以前はExerbによる実行ファイル(.exe)生成が主流でしたが、Ruby1.9以降Exerbは動作しなくなりました。
そこで登場したのが今回のOCRA(One-Click Ruby Application)です。本当に簡単に実行ファイルを生成することができました!ご紹介します。
OCRAはRubyスクリプトからWindows実行ファイルを生成します。生成された実行ファイルは、Rubyインタプリタ、ソースコード、その他に必要なRubyライブラリやDLLを含む自己解凍型の自己実行型の実行可能ファイルです。
OCRAは実行時にRubyインタプリタとスクリプトを一時ディレクトリに展開します。アプリケーションのソースファイルは 'src'サブディレクトリに置かれます。コードが見られる可能性があることは覚えておきましょう。
余談ですが、最近はNeriというのがあるようで今後こちらのほうが主流になっていくのかもしれません。
###前提
- Windows 10 Enterprise
- Ruby 2.3.3p222 (RailsInstallerでインストール)
- Ocra 1.3.10 (Ruby 1.8.7, 1.9.3, 2.0.0、および2.1.5をサポート)
サポート外のRuby2.3.3を使っているのはご愛敬。
##手順
Rubyにパスの通ったコマンドプロンプト(Command Prompt with Ruby and Rails)を起動します。
###インストール
ocraのgemをインストールします。ocraコマンドが使えるようになります。
gem install ocra -r
私の環境ではPROXYサーバを指定しないとインターネット通信ができないため、次のようにPROXyをしてしました。
gem install ocra -r -p http://my-proxy.local:8080
OCRAは、1ファイルのRubyスクリプトです。ocrasa.rbを入手して使うことも可能です。
gemインストールが完了したら、ocraコマンドの実行を確認しましょう。
ocra --version
###実行ファイル生成
では、いよいよ、Rubyスクリプトから実行ファイルを生成します。
Rubyスクリプトを引数に指定してocraコマンドを実行するだけです。本当に簡単。
注意すべきは、OCRAはRubyスクリプトを静的に解析するのではなく、OCRAはまず、実行時に読み込まれて使用されるファイルを検出するために、対象のRubyスクリプトを実行します。実行による副作用が発生します。外部にアクセスするとかファイルを更新するとか。
次の例では、check.exeが生成されます。
ocra check.rb
ウィンドウアプリケーション(GUIアプリケーション)の場合にコンソールウィンドウがポップアップせずにアプリケーションが起動するようにするには、" --windows "オプションを使用します。
ocra --windows check.rb
実行結果
=== Loading script to check dependencies
=== Attempting to trigger autoload of Gem::ConfigFile
=== Attempting to trigger autoload of Gem::DependencyList
=== Attempting to trigger autoload of Gem::DependencyResolver
=== Attempting to trigger autoload of Gem::Installer
=== Attempting to trigger autoload of Gem::Licenses
=== Attempting to trigger autoload of Gem::RequestSet
=== Attempting to trigger autoload of Gem::Source
=== Attempting to trigger autoload of Gem::SourceList
=== Attempting to trigger autoload of Gem::SpecFetcher
=== Attempting to trigger autoload of CGI::HtmlExtension
=== Detected gem did_you_mean-1.0.0 (loaded, files)
=== 14 files, 32442 bytes
=== Detected gem io-console-0.4.5 (loaded, files)
=== WARNING: Gem io-console-0.4.5 root folder was not found, skipping
=== Including 56 encoding support files (3467776 bytes, use --no-enc to exclude)
生成されたcheck.exeは2.75MBでした。
###その他
スクリプトの実行時にKernel#requireを使用してロードされたコードは、OCRA実行可能ファイルに含まれます。OCRAがスクリプトを呼び出すときにコードが実際に実行されない限り、条件付きでロードされるコードはロードされず、実行可能ファイルに含まれません。
RubyGemsは特別に扱われます。Gemのファイルが検出されるたびに、OCRAはその特定のGemのすべての必要なファイルをインクルードしようとします。この動作は、-gem- *オプションを使用して制御できます。
###参考