← Blog

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:

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

Was sich zuletzt geändert hat

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.