OCRAN: Ruby-Skripte als ausführbare Programme für Windows, Linux und macOS
Ich pflege OCRAN, ein Ruby-Gem, das Ruby-Anwendungen für die Weitergabe verpackt. Es bündelt Ihr Skript, den Ruby-Interpreter, Ihre Gems und die benötigten nativen Bibliotheken in ein eigenständiges Paket. Wer Ihr Programm ausführen möchte, muss Ruby also nicht installieren. Seit Version 1.4 funktioniert das unter Windows, Linux und macOS.
OCRAN steht für «One-Click Ruby Application Next». In diesem Beitrag erkläre ich, woher OCRAN kommt, wie Sie es verwenden und was sich in letzter Zeit geändert hat.
Von OCRA zu OCRAN
OCRAN ist ein Fork von OCRA, dem One-Click Ruby Application Builder, den Lars Christensen 2009 ins Leben gerufen hat. Viele Jahre lang war OCRA der übliche Weg, aus einem Ruby-Skript eine Windows-.exe zu machen. Die letzte OCRA-Version, 1.3.11, erschien im März 2020; laut Changelog unterstützt sie Ruby 2.2 bis 2.7.
2023 habe ich OCRA geforkt, damit es mit aktuellen Ruby-Versionen weiter funktioniert. Die erste OCRAN-Version, 1.3.12, unterstützte Ruby bis 3.2. Das Projekt ist keine Ein-Personen-Arbeit: shinokaro ist im Gemspec als Mitautor aufgeführt, und ein grosser Teil der Commits seit dem Fork stammt von shinokaro. Auch Lars Christensen ist weiterhin als Autor genannt, denn die Grundlage ist seine Arbeit.
Falls Sie noch OCRA verwenden: Ich habe eine kurze Anleitung für den Umstieg von OCRA auf OCRAN geschrieben. Die Kommandozeilenoptionen sind dieselben.
Was OCRAN erzeugt
OCRAN kennt vier Ausgabeformate:
- Selbstentpackendes Programm (Standard): eine
.exeunter Windows, eine native ausführbare Datei unter Linux und macOS. Beim Start entpackt es sich in ein temporäres Verzeichnis und läuft von dort. - Verzeichnis (
--output-dir): alle Dateien in einem Ordner, dazu ein Startskript (.shunter Linux/macOS,.batunter Windows). - Zip-Archiv (
--output-zip): wie das Verzeichnis, aber als.zipverpackt. - macOS-App-Bundle (
--macosx-bundle): ein.app-Bundle für den Finder, das Dock und die Code-Signierung.
Unter Windows können Sie mit Inno Setup (--innosetup) zusätzlich einen richtigen Installer erstellen.
Erste Schritte
OCRAN benötigt Ruby 3.2 oder neuer.
gem install ocran
ocran script.rb
Damit wird script.rb ausgeführt, OCRAN merkt sich alle geladenen Dateien und Bibliotheken und erzeugt script.exe unter Windows bzw. script unter Linux und macOS.
Die anderen Ausgabeformate:
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
Zusätzliche Dateien, Verzeichnisse oder Glob-Muster hängen Sie einfach an. Argumente für Ihr Skript folgen nach --:
ocran script.rb assets/**/*.png
ocran script.rb -- --some-option=value
ocran --help zeigt alle Optionen.
Wie die Erkennung der Abhängigkeiten funktioniert
OCRAN analysiert Ihren Code nicht statisch. Es führt Ihr Skript während des Builds aus und übernimmt alles, was dabei über require und load geladen wird. Code, der nur unter bestimmten Bedingungen geladen wird, landet nur dann im Paket, wenn diese Bedingungen während des Builds eintreten.
Bei Programmen, die ein Fenster öffnen oder auf Eingaben warten, können Sie die Konstante Ocran prüfen. Sie ist nur definiert, während OCRAN baut:
app = MyApp.new
app.main_loop unless defined?(Ocran)
Fehlen zur Laufzeit Dateien aus einem Gem, versuchen Sie zuerst --gem-all=gemname und danach --gem-full=gemname. Bei Bundler-Projekten übernimmt --gemfile Gemfile alle im Gemfile aufgeführten Gems.
Wenn das selbstentpackende Programm läuft, zeigt $0 in das temporäre Verzeichnis. Die Umgebungsvariable OCRAN_EXECUTABLE enthält den vollständigen Pfad der ausführbaren Datei selbst. Damit finden Sie Dateien, die Sie daneben ausliefern:
base_dir = File.dirname(ENV["OCRAN_EXECUTABLE"].to_s)
Worauf Sie achten sollten
- Kein Cross-Compiling. OCRAN bündelt das Ruby des Rechners, auf dem es läuft. Windows-Programme bauen Sie also unter Windows, Linux-Programme unter Linux und macOS-Programme unter macOS. Im README finden Sie einen GitHub-Actions-Workflow, der alle drei baut.
- glibc unter Linux. OCRAN bündelt gemeinsam genutzte Bibliotheken wie libyaml oder libssl, glibc stammt aber immer vom Zielsystem. Bauen Sie deshalb auf der ältesten Distribution, die Sie unterstützen möchten.
- CPU-Architektur. Das Ergebnis entspricht dem Ruby, mit dem Sie bauen. Ein ARM64-Ruby auf Apple Silicon erzeugt ein ARM64-Programm, das auf Intel-Macs nicht läuft.
- Startzeit. Das selbstentpackende Programm entpackt sich bei jedem Start. Wenn Ihnen das zu langsam ist, verwenden Sie
--output-dir,--output-zipoder einen Inno-Setup-Installer.
Was sich zuletzt geändert hat
- 1.3.17 (Mai 2025): Datei- und Verzeichnisnamen mit Multibyte-Zeichen (UTF-8) unter Windows 10 ab Version 1903.
- 1.3.18 (März 2026): Unterstützung für Ruby 4.0, Windows-Authenticode-Code-Signierung und Ruby 3.2 als Mindestversion.
- 1.4.0 (März 2026): Unterstützung für Linux und macOS sowie
--output-dir,--output-zipund--macosx-bundle. Es gibt nun plattformspezifische Gems, sodassgem install ocranautomatisch den passenden vorkompilierten Stub wählt. Die CI testet Ruby 3.2, 3.3, 3.4 und 4.0 unter Linux, macOS (ARM und Intel) und Windows. - 1.4.4 (August 2026): Unter Linux werden erkannte gemeinsam genutzte Bibliotheken mitgeliefert, damit die Programme auch auf Distributionen laufen, denen diese fehlen. Auch das Ruby aus den Paketquellen der Distribution, etwa unter Fedora, funktioniert. Die Wrapper-
.exeim Stil von OCRA für Inno-Setup-Installer ist zurück. - 1.4.5 (August 2026): Die neue Option
--chdir-exe-dirsetzt das Arbeitsverzeichnis auf den Ordner, in dem die ausführbare Datei liegt. Ausserdem gibt es die experimentelle Option--cosmo-ruby, die ein mit Cosmopolitan gebautes Ruby in eine einzige Datei packt, die unter Linux, macOS und Windows läuft. Sie ist noch experimentell; lesen Sie bitte das README, bevor Sie sich darauf verlassen.
Die vollständige Liste finden Sie im Changelog.
Rückmeldungen
Wenn etwas nicht funktioniert, schauen Sie bitte zuerst in die Issues auf GitHub und eröffnen Sie ein neues, falls Ihr Problem noch nicht beschrieben ist. Angaben zur Ruby-Version, zum Betriebssystem und zum genauen ocran-Befehl helfen sehr.
- Quellcode: github.com/largo/ocran
- Gem: rubygems.org/gems/ocran