Sinatra / Ruby Apps als Windows exe?

Klar, mit Ocra!

Aktuell arbeite ich an einem kleinen Tool zur Personenverwaltung. Dreh und Angelpunkt dabei ist eine gute Suche. Um die Anwendung solls hier allerdings nicht gehen. Ich wollte das Tool gern mit Ruby entwickeln, eine Anforderung ist allerdings, dass es später bei verschiedenen Personen unter Windows laufen soll. Gut, als Webapp ist das ja kein Problem, doch sollen die Personendaten nicht im Web liegen, sondern bei den jeweiligen Leuten auf dem lokalen Rechner. Daher wäre eine Windowsanwendung der bessere Weg. Also hab ich mich schlau gemacht und rausgesucht wie man Ruby-Webapps in eine .exe verwandelt.

Schlussendlich hab ich mit Ocra wunderbare Erfahrungen gemacht, die ich hier teilen möchte. Nicht zuletzt um mich selbst wieder daran zu erinnern.

Da Orca nur in einer Windows Umgebung läuft muss man entweder selbst unter Windows entwickeln oder sicherstellen, dass seine Anwendung – in meinem Fall übrigends eine Sinatra App – auch auf Windows läuft. Dank RubyInstaller ist die Installation von Ruby unter Windows ja kein Problem. Um die .exe später zu Verwenden brauch man übrigends kein installiertes Ruby mehr.

Arbeitet man mit Bundler sollten die benötigten Gems recht einfach und schnell installiert sein. Ist sichergestellt, dass deine Anwendung auf Windows funktioniert, gehts weiter.

Man installiert Ocra via ‚gem install ocra‘ und öffnet dann eine Konsole, geht ins Verzeichnis seiner Anwendung und gibt dort

ocra --no-autoload DeineAnwendung.rb views\* public\*

ein. Die Option –no-autoload verhindert, dass automatisch alle Abhängigkeiten geladen werden. Wenn ich diese Option weglasse werden unnötige Abhängigkeiten von Rack geladen und das wirft dann einen Fehler vom gem i18n. Bei Problemen wärend der Umwandlung lohnt es sich allemal mit den Parametern von Ocra rumzuexperimentieren.

Ocra startet nun deine Anwendung (in meinem Fall den Sinatra Rackserver) um die benötigten Bibliotheken und Gems zu ermitteln. Man kann Ocra auch anweisen ein Gemfile zu nutzen und die App nicht zu starten (via –no-dep-run und –gemfile ). Bei mir klappte es damit allerdings leider nicht später die exe auch zu verwenden. Mir erscheint es als würden dann nicht alle notwendigen Bibliotheken erkannt, vorallem gibt es dann Probleme mit der Rubygems Umgebung. Daher ist es besser die Anwendung von Ocra starten zu lassen und dann komplett zu testen. Bei mir bedeutet das, alle Funktionen im Browser durchzutesten. Wichtig sind dabei vorallem Datenbank Aktionen. Hab ich diese Dinge nicht getestet wurden auch entsprechende Abhängigkeiten nicht erkannt.

Anschließend kann man seine Anwendung beenden, hier z.B. mit Ctrl+c. Ocra listet nun alle Abhängigkeiten auf und erstellt die .exe.

Einige Hinweise

Dein Script sollte ganz oben ein ‚require „rubygems“‚ beinhalten, ansonsten kommt es ggf. später in der exe zu Problemen mit der Rubygems Umgebung.

Bindet man andere Rubydateien in seiner Anwendung ein, dann lohnt es sich ‚require_relative‘ zu verwenden statt mit ‚./‘ das aktuelle Verzeichnis kenntlich zu machen.

Hat man auch eine Datenbank in Form einer Datei, z.B. SQLite3, dann sollte man nach generierung der .exe die Datenbankdatei zusammen mit der .exe ausliefern. Lässt man die Datenbankdatei mit in die .exe einpacken werden später Änderungen an den Daten nicht dauerhaft gespeichert, weil die DB-Datei dann immer wieder neu ausgepackt wird und daher beim alten Stand bleibt. Bei einer MySql Datenbankverbindung o.ä. ist das natürlich egal.

Firewall: Unter Windows startet Sinatra den Server meist auf localhost:4567. Bei jedem Start erscheint dann eine Firewall Meldung. Da dies recht nervig ist habe ich den lokalen Port 4567 in die Firewall als eingehende Regel definiert. Mein Ziel ist nach erfolgreichem Start direkt den Browser zu öffnen oder eine andere Adresse zu verwenden, aber dazu folgt ggf. später ein Update.

Links zum Thema

http://rubyonwindows.blogspot.de/2009/05/ocra-one-click-ruby-application-builder.html
http://wiki.ruby-portal.de/OCRA

Advertisements

Registry Userprofile Einträge bearbeiten

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList

Dort kann man die Pfade/Schlüssel der User löschen. Nachdem man sich dann neu angemeldet hat, wird ein neues Profil angelegt.

Dies brauchte ich wärend meiner Ausbildung am UFZ einige male, da wir hier auf virtuellen Maschinen arbeiteten und diese hin und wieder Userprofileinträge verhagelt hatten.