OCRAN:RubyスクリプトをWindows・Linux・macOS向けの実行ファイルにする
私は OCRAN というRubyのgemをメンテナンスしています。OCRANはRubyアプリケーションを配布用にパッケージするツールで、スクリプト、Rubyインタプリタ、gem、必要なネイティブライブラリを1つにまとめます。そのため、受け取った人はRubyをインストールしなくてもプログラムを実行できます。バージョン1.4からは、Windowsに加えてLinuxとmacOSにも対応しました。
OCRANは「One-Click Ruby Application Next」の略です。この記事では、OCRANの成り立ち、使い方、最近の変更点を紹介します。
OCRAからOCRANへ
OCRANは、Lars Christensenさんが2009年に始めた OCRA(One-Click Ruby Application Builder)のフォークです。OCRAは長い間、RubyスクリプトからWindowsの .exe を作る定番の方法でした。ただ、最後のリリースは2020年3月の1.3.11で、変更履歴に記載されている対応バージョンはRuby 2.2〜2.7です。
私は2023年に、新しいRubyでも使い続けられるようにOCRAをフォークしました。最初のOCRANリリースである1.3.12は、Ruby 3.2まで対応していました。開発は私ひとりで進めているわけではありません。gemspecには共著者としてshinokaroさんが載っており、フォーク以降のコミットの多くはshinokaroさんによるものです。土台を作ったLars Christensenさんも、引き続き作者として記載されています。
まだOCRAを使っている方向けに、OCRAからOCRANへの移行ガイドを用意しました。コマンドラインオプションは同じです。
OCRANが出力するもの
出力形式は4種類あります。
- 自己展開型の実行ファイル(デフォルト):Windowsでは
.exe、LinuxとmacOSではネイティブの実行ファイルになります。起動するたびに一時ディレクトリへ展開され、そこから実行されます。 - ディレクトリ(
--output-dir):すべてのファイルをフォルダに出力し、起動スクリプト(Linux/macOSは.sh、Windowsは.bat)を添えます。 - zipアーカイブ(
--output-zip):ディレクトリ出力と同じ内容を.zipにまとめます。 - macOSのアプリバンドル(
--macosx-bundle):Finder、Dock、コード署名に対応した.appバンドルです。
Windowsでは、Inno Setup(--innosetup)を使って本格的なインストーラーを作ることもできます。
使ってみる
OCRANにはRuby 3.2以降が必要です。
gem install ocran
ocran script.rb
これで script.rb が実行され、読み込まれたファイルやライブラリが記録されます。そのうえで、Windowsでは script.exe、LinuxとmacOSでは script が作られます。
ほかの出力形式は次のとおりです。
ocran --output-dir myapp/ script.rb
ocran --output-zip myapp.zip script.rb
ocran --macosx-bundle --output MyApp --bundle-id com.example.myapp --icon icon.icns script.rb
追加のファイルやディレクトリ、globパターンはそのまま後ろに並べます。スクリプトに渡す引数は -- の後に書きます。
ocran script.rb assets/**/*.png
ocran script.rb -- --some-option=value
すべてのオプションは ocran --help で確認できます。
依存関係の検出のしくみ
OCRANはコードを静的に解析するのではなく、ビルド中に実際にスクリプトを実行し、require や load で読み込まれたものをすべて取り込みます。条件によってだけ読み込まれるコードは、ビルド時の実行でその条件を通った場合にしか含まれません。
ウィンドウを開いたり入力を待ったりするプログラムでは、Ocran 定数を確認すると便利です。この定数はOCRANがビルドしている間だけ定義されます。
app = MyApp.new
app.main_loop unless defined?(Ocran)
実行時にgemのファイルが足りない場合は、まず --gem-all=gemname、次に --gem-full=gemname を試してください。Bundlerを使っているプロジェクトでは、--gemfile Gemfile でGemfileに書かれたgemをすべて含められます。
自己展開型の実行ファイルが動いているとき、$0 は一時ディレクトリの中を指します。一方、環境変数 OCRAN_EXECUTABLE には実行ファイル自体のフルパスが入っているので、実行ファイルと同じ場所に置いたファイルを探すときに使えます。
base_dir = File.dirname(ENV["OCRAN_EXECUTABLE"].to_s)
注意点
- クロスコンパイルはできません。 OCRANはビルドしているマシンのRubyを同梱するので、Windows用はWindowsで、Linux用はLinuxで、macOS用はmacOSでビルドします。READMEには、3つをまとめてビルドする GitHub Actionsのワークフロー が載っています。
- Linuxのglibc。 libyamlやlibsslなどの共有ライブラリは同梱されますが、glibcは常に実行先のシステムのものが使われます。サポートしたい中でいちばん古いディストリビューションでビルドしてください。
- CPUアーキテクチャ。 出力はビルドに使ったRubyに合わせたものになります。Apple SiliconのARM64版Rubyでビルドすると、Intel Macでは動かないARM64の実行ファイルになります。
- 起動時間。 自己展開型の実行ファイルは起動のたびに展開を行います。遅いと感じる場合は、
--output-dir、--output-zip、またはInno Setupのインストーラーを使ってください。
最近の変更点
- 1.3.17(2025年5月):Windows 10 バージョン1903以降で、マルチバイト(UTF-8)のファイル名・ディレクトリ名に対応しました。
- 1.3.18(2026年3月):Ruby 4.0に対応し、WindowsのAuthenticodeによるコード署名をサポートしました。最低バージョンはRuby 3.2になりました。
- 1.4.0(2026年3月):LinuxとmacOSに対応し、
--output-dir、--output-zip、--macosx-bundleを追加しました。プラットフォームごとのgemを公開しているので、gem install ocranで適切なビルド済みスタブが自動的に選ばれます。CIではRuby 3.2、3.3、3.4、4.0を、Linux、macOS(ARMとIntel)、Windowsでテストしています。 - 1.4.4(2026年8月):Linuxでは検出した共有ライブラリを同梱するようになり、それらが入っていないディストリビューションでも動くようになりました。Fedoraなどのディストリビューションが提供するRubyでも使えます。また、Inno Setupのインストーラー用に、OCRAと同じ形式のラッパー実行ファイルが復活しました。
- 1.4.5(2026年8月):新しいオプション
--chdir-exe-dirで、作業ディレクトリを実行ファイルのあるフォルダに設定できます。さらに実験的なオプション--cosmo-rubyを追加しました。Cosmopolitanでビルドした Ruby を1つのファイルにまとめ、Linux、macOS、Windowsで動かせるようにするものです。まだ実験段階なので、使う前にREADMEを読んでください。
すべての変更は CHANGELOG にあります。
フィードバック
うまく動かないときは、まず GitHubのIssue を確認し、同じ問題がなければ新しく登録してください。Rubyのバージョン、OS、実行した ocran コマンドを書いていただけると、とても助かります。
- ソースコード:github.com/largo/ocran
- gem:rubygems.org/gems/ocran