Die Programmiersprache Ruby

Blog| Forum| Wiki  


RubyGem OCRA
Entwickler: Lars Christensen
Aktuelle stabile Version: 1.2.0
Lizenz: MIT-Lizenz
Gem-Install-Befehl: gem install ocra
require-Statement: require "(nicht vorhanden)"
Website: http://rubyforge.org/projects/ocra

Die Abkürzung OCRA steht für One-Click Ruby Application builder und es handelt sich dabei um ein Gem, das Ruby-Skripte in Windows-native Executables, also *.exe-Dateien, umwandelt. OCRA steht in der Tradition des nunmehr veralteten rubyscript2exe.rb und darf getrost als die aktuelle Alternative angesehen werden.
Der Sinn und Zweck der ganzen Sache ist es, Windows-Nutzern die Verwendung von Ruby-Programmen zu vereinfachen, da kaum ein typischer Windows-Nutzer den Ruby-Interpreter, der zum Ausführen von Ruby-Skripten zwingend erforderlich ist, installiert hat und erwartet wird, dass eine Anwendung als *.exe-Datei geliefert wird und diese dann so wie sie ist unverändert lauffähig ist.

Wendet man nun den Befehl ocra auf ein Ruby-Skript an, so führt OCRA das Ruby-Skript aus, um dessen Abhängigkeiten festzustellen, und packt es anschließend zusammen mit dem gesamten Ruby-Interpreter in eine einzelne *.exe-Datei, sodass der Aufwand für den Endnutzer minimal ist (nämlich einfach nur die Datei auszuführen). Wird die Executable ausgeführt, so wird die *.exe-Datei in ein temporäres Verzeichnis entpackt, das exakt so aussieht wie eine typische Ruby-Installation. Zusätzlich gibt es einen Unterordner src/, in dem sich das nun wieder entpackte Skript befindet. Visuell sieht das entpackte Verzeichnis also etwa so aus (mit den entsprechenden Unterverzeichnissen natürlich):

1
2
3
4
5
6
/
  bin/
  include/
  lib/
  share/
  src/     <----- Hierdrin befindet sich das Skript


Wichtig ist, dass der Begriff "kompilieren" für OCRA falsch angesetzt ist; es handelt sich hierbei technisch nicht um einen Compiler, sondern um einen (sehr starken) Kompressor. Ein Compiler wurde für Ruby bislang nicht geschrieben und wird es aufgrund der sehr dynamischen Natur der Sprache wohl auch nie werden.

Inhaltsverzeichnis

Installation

OCRA ist als RubyGem verfügbar, daher genügt ein einfaches:


gem install ocra


Anwendung

OCRA ist über die Kommandozeile durch den Befehl ocra verfügbar. Die Anwendung sieht so aus:


ocra [OPTIONEN] SKRIPT [WEITERE_DATEIEN]


ocra versteht die folgenden Optionen:

Option Beschreibung
--dll DLLNAME Bindet eine Extra-DLL oder auch eine andere Datei ein. Die Datei muss sich im bin/-Verzeichnis der Ruby-Installation befinden.
--no-lzma Schaltet die LZMA-Komprimierung ab. Diese Option sollte nur in Problemfällen benutzt werden, da sie in der Ausgabe sehr großer Executables resultiert.
--quiet Unterdrückt die Ausagabe von OCRAs Statusmeldungen.
--windows Erzwingt das Erstellen einer GUI-Anwendung.
--console Erzwingt das Erstellen einer Konsolen-Anwendung.
--no-autoload Aufrufe von #autoload werden ignoriert. Dies kann zu fehlenden Abhängigkeiten führen.
--icon ICO Benutzt ICO als Icon für die Executable. Muss eine *.ico-Datei sein. Fehlt die Option, so wird das Ruby-Icon benutzt.

Die Bedeutung von [WEITERE DATEIEN] wird weiter unten im Abschnitt OCRA#Weitere_Dateien_einbinden beschrieben.

Eine Liste sämtlicher Optionen kann mit


ocra --help


erhalten werden. Wird ocra ohne eine der Optionen --windows oder --console aufgerufen, entscheidet es sich anhand der Dateiendung des Skripts: *.rb bedeutet Konsolenanwendung, *.rbw GUI-Anwendung.

Die Unterscheidung zwischen GUI- und Konsolenanwendung ist erforderlich, weil eine Konsolenanwendung unter Windows grundsätzlich eine Konsole für die Ein- und Ausgabe erhält. Diese ist bei einer GUI-Anwendung störend, da bei der Ausführung des Programms ständig ein CMD-Fenster mitaufpoppt. Der Nachteil einer GUI-Anwendung besteht darin, dass es nicht möglich ist, Meldungen an STDOUT zu senden; sie werden einfach ignoriert oder führen sogar zu einem sofortigen Programmcrash, der nicht einmal eine Exception verursacht. Dies kann umgangen werden, indem man im Programm selbst eine Umleitung von $stdout etwa in eine Logfile vornimmt:


$stdout = File.open("mein_programm.log", "a")


Gleiches gilt für $stdin, jedoch benötigt eine GUI-Anwendung eher selten Konsoleninput.

Damit sieht die häufigste Anwendungszeile für ein mit OCRA komprimiertes Programm so aus:


ocra --icon C:\mein_icon.ico --windows mein_skript.rb


Feststellen, ob OCRA gerade ein Skript komprimiert

Häufig ist es praktisch zu wissen, ob ein Skript gerade mit OCRA komprimiert wird, da OCRA ein Skript wie schon oben erwähnt ausführt, um dessen Abhängigkeiten festzustsellen. Selten ist es erforderlich, dass die gesamte Anwendung durchlaufen wird, weshalb man gern in der Lage wäre, die Ausführung im Falle einer Komprimierung durch OCRA direkt nach dem Einbinden der zu verwendeten Programmbibliotheken abzubrechen. Nun, man kann! Während OCRA das Skript ausführt, ist innerhalb des Skripts die Konstante Ocra verfügbar. Darum herum kann man sich dann so eine Methode basteln:

1
2
3
4
5
6
7
8
9
10
module Kernel
  
  #Returns a truth value if the script is currently being 
  #compressed by OCRA. 
  def compressing?
    defined? Ocra
  end
  private :compressing?
  
end


Dieses Schnippsel schreibt man entweder direkt an den Anfang eines Skripts oder lagert es aus in ein Externes, welches man per #require einbindet. Danach kann man überall im Skript mit der global verfügbaren Methode (global, weil wir sie in Rubys Hauptmodul Kernel definiert haben) #compressing? feststellen, ob OCRA gerade arbeitet und anhand dessen bestimmten Code ausführen oder eben, wie es meistens der Fall ist, das Programm sauber beenden:

1
2
3
4
if compressing?
  puts "Detected compression by OCRA. Terminating."
  exit #Beendet den Ruby-Interpreter sofort
end


Working Directory

Im Zusammenhang mit dem aktuellen Working Directory des Skripts tauchen immer wieder Probleme auf. Du solltest unter keinen Umständen ein spezielles Working Directory annehmen, wenn dein fertiges OCRA-Programm ausgeführt wird. Folgende Beispiele aus der README von OCRA:

  • Verzeichnis der *.exe-Datei (per Doppelklick aufgerufen)
  • Arbeitsverzeichnis des Benutzers (per Kommandozeile aufgerufen)
  • C:\Windows\system32 (über Dateityp-Verknüpfung aufgerufen)

In das temporär entpackte Verzeichnis kannst du innerhalb des Skripts wie folgt wechseln:


Dir.chdir(File.dirname(__FILE__))


require_relative ist davon freilich nicht betroffen, da es ohnehin immer relativ zum Skript arbeitet.

Um das Verzeichnis festzustellen, in dem die Executable liegt, kannst du auf die von OCRA definierte Umgebungsvariable OCRA_EXECUTABLE zurückgreifen. Sie ist nur für fertig komprimierte *.exe-Dateien verfügbar, stelle also sicher, dass dein Skript auch ohne sie auskommt, wenn es "roh" gestartet wird.

Skript ("skript.rb"):


p ENV["OCRA_EXECUTABLE"]


Anwendung:

1
2
3
4
$ ruby skript.rb
nil
$ skript.exe
"C:\\skript.exe"


Achte bitte darauf, dass der Pfad von OCRA mit Backslashes angegeben wird, um nicht im Kompatibilitätsprobleme zu geraten.

Weitere Dateien einbinden

Neben der --dll-Option gibt es noch eine Möglichkeit, der *.exe-Datei weitere Dateien hinzuzufügen. Die folgende Möglichkeit sollte immer, wenn es sich nicht um Dinge wie DLLs handelt (für die nun mal die --dll-Option gedacht ist), angewandt werden.

Die hinzuzufügenden Dateien können einfach auf der Kommandozeile hinter den Skriptnamen geschrieben werden. Ocra versteht auch das *-Wildcard, sodass folgendes möglich wäre:


ocra --windows skript.rb eine_datei.txt graphics/*.png


Wodurch im temporär entpackten src/-Verzeichnis die folgende Struktur entstünde:

1
2
3
4
5
6
/src
  - eine_datei.txt
  - skript.rb
  graphics/
    - bild1.png
    - bild2.png


Beispiel

Als Beispiel wollen wir folgende wxRuby-Anwendung in eine *.exe-Datei umwandeln:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#Encoding: UTF-8

module Kernel
  
  def compressing?
    defined? Ocra
  end
  private :compressing?
  
end

#============================================================
#Eigentlicher Skript-Start
#============================================================

#$stdout nicht während der Komprimierung umleiten, da ansonsten 
#die Statusmeldungen in der Logfile landen: 
$stdout = File.open("gui.log", "a") unless compressing?

print "Laden der Libs... "
require "wx"
puts "Fertig."

#Das eigentliche Ausführen des Programms ist nicht notwendig, 
#da bereits hier alle Libs geladen wurden: 
exit if compressing?

class MyFrame < Wx::Frame
  include Wx
  
  def initialize(parent = nil)
    super(parent, title: "Test", size: Size.new(400, 400))
    self.background_colour = NULL_COLOUR
    
    StaticText.new(self, label: "Eine OCRA-Test-Anwendung.", pos: Point.new(20, 20))
    @button = Button.new(self, label: "Klick mich!", pos: Point.new(20, 50))
    
    evt_button(@button){|event| on_button_click(event)}
  end
  
  private
  
  def on_button_click(event)
    puts "Der Button wurde geklickt!"
    md = MessageDialog.new(self, 
      caption: "Hallo!", 
      message: "Schön! Du hast den Button angeklickt!", 
      style: OK | ICON_INFORMATION)
    md.show_modal
  end
  
end

class MyApp < Wx::App
  include Wx
  
  def on_init
    @mainwindow = MyFrame.new
    @mainwindow.show
  end
  
end

print "Erstellen der GUI... "
x = MyApp.new
puts "Fertig."
x.main_loop


Wenn das Programm in einer Datei gui.rb liegt, so wird es wie folgt in eine *.exe-Datei umgewandelt:


ocra --dll rubyw.exe.manifest --windows gui.rb


Auf ein Icon habe ich hier verzichtet. An diesem Beispiel kann man auch die Verwendung der --dll-Option erkennen, denn wxRuby benutzt nur die Visual Styles von Windows, wenn diese Datei im bin/-Verzeichnis des ausführenden Rubys verfügbar ist (siehe dazu WxRuby#Visual_Styles_unter_Windows). Die Schlussfolgerung für OCRA-Anwendungen lautet demnach, sie mit --dll einzubinden.

Als Ausgabe erhalten wir soetwas:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
=== Loading script to check dependencies
Laden der Libs... Fertig.
=== Building gui.exe
m src
a src\gui.rb
m bin
a bin\rubyw.exe
a bin\msvcrt-ruby191.dll
a bin\rubyw.exe.manifest
m lib
m lib\ruby
m lib\ruby\1.9.1
m lib\ruby\1.9.1\i386-mingw32
m lib\ruby\1.9.1\i386-mingw32\enc
a lib\ruby\1.9.1\i386-mingw32\enc\encdb.so
a lib\ruby\1.9.1\i386-mingw32\enc\iso_8859_1.so
m lib\ruby\1.9.1\i386-mingw32\enc\trans
a lib\ruby\1.9.1\i386-mingw32\enc\trans\transdb.so
m lib\ruby\site_ruby
m lib\ruby\site_ruby\1.9.1
m lib\ruby\site_ruby\1.9.1\rubygems
a lib\ruby\site_ruby\1.9.1\rubygems\defaults.rb
a lib\ruby\1.9.1\thread.rb
a lib\ruby\1.9.1\i386-mingw32\etc.so
a lib\ruby\1.9.1\i386-mingw32\rbconfig.rb
a lib\ruby\site_ruby\1.9.1\rubygems\exceptions.rb
a lib\ruby\site_ruby\1.9.1\rubygems\version.rb
a lib\ruby\site_ruby\1.9.1\rubygems\requirement.rb
a lib\ruby\site_ruby\1.9.1\rubygems\dependency.rb
a lib\ruby\site_ruby\1.9.1\rubygems\gem_path_searcher.rb
a lib\ruby\site_ruby\1.9.1\rubygems\user_interaction.rb
a lib\ruby\site_ruby\1.9.1\rubygems\platform.rb
a lib\ruby\site_ruby\1.9.1\rubygems\specification.rb
a lib\ruby\site_ruby\1.9.1\rubygems\source_index.rb
a lib\ruby\site_ruby\1.9.1\rubygems\builder.rb
a lib\ruby\1.9.1\i386-mingw32\dl.so
a lib\ruby\1.9.1\Win32API.rb
a lib\ruby\site_ruby\1.9.1\rubygems\config_file.rb
a lib\ruby\1.9.1\i386-mingw32\stringio.so
m lib\ruby\1.9.1\yaml
a lib\ruby\1.9.1\yaml\error.rb
a lib\ruby\1.9.1\i386-mingw32\syck.so
a lib\ruby\1.9.1\yaml\ypath.rb
a lib\ruby\1.9.1\yaml\basenode.rb
a lib\ruby\1.9.1\yaml\syck.rb
a lib\ruby\1.9.1\yaml\tag.rb
a lib\ruby\1.9.1\yaml\stream.rb
a lib\ruby\1.9.1\yaml\constants.rb
m lib\ruby\1.9.1\date
a lib\ruby\1.9.1\date\format.rb
a lib\ruby\1.9.1\date.rb
a lib\ruby\1.9.1\yaml\rubytypes.rb
a lib\ruby\1.9.1\yaml\types.rb
a lib\ruby\1.9.1\yaml.rb
a lib\ruby\site_ruby\1.9.1\rubygems.rb
m lib\ruby\gems
m lib\ruby\gems\1.9.1
m lib\ruby\gems\1.9.1\gems
m lib\ruby\gems\1.9.1\gems\wxruby-ruby19-2.0.1-x86-mingw32
m lib\ruby\gems\1.9.1\gems\wxruby-ruby19-2.0.1-x86-mingw32\lib
a lib\ruby\gems\1.9.1\gems\wxruby-ruby19-2.0.1-x86-mingw32\lib\wxruby2.so
m lib\ruby\gems\1.9.1\gems\wxruby-ruby19-2.0.1-x86-mingw32\lib\wx
a lib\ruby\gems\1.9.1\gems\wxruby-ruby19-2.0.1-x86-mingw32\lib\wx\version.rb
a lib\ruby\gems\1.9.1\gems\wxruby-ruby19-2.0.1-x86-mingw32\lib\wx\helpers.rb
m lib\ruby\gems\1.9.1\gems\wxruby-ruby19-2.0.1-x86-mingw32\lib\wx\classes
a lib\ruby\gems\1.9.1\gems\wxruby-ruby19-2.0.1-x86-mingw32\lib\wx\classes\evthandler.rb
a lib\ruby\gems\1.9.1\gems\wxruby-ruby19-2.0.1-x86-mingw32\lib\wx\classes\acceleratortable.rb
a lib\ruby\gems\1.9.1\gems\wxruby-ruby19-2.0.1-x86-mingw32\lib\wx\classes\animation.rb
a lib\ruby\gems\1.9.1\gems\wxruby-ruby19-2.0.1-x86-mingw32\lib\wx\classes\app.rb
a lib\ruby\gems\1.9.1\gems\wxruby-ruby19-2.0.1-x86-mingw32\lib\wx\classes\artprovider.rb
a lib\ruby\gems\1.9.1\gems\wxruby-ruby19-2.0.1-x86-mingw32\lib\wx\classes\auinotebook.rb
a lib\ruby\gems\1.9.1\gems\wxruby-ruby19-2.0.1-x86-mingw32\lib\wx\classes\bitmap.rb
a lib\ruby\gems\1.9.1\gems\wxruby-ruby19-2.0.1-x86-mingw32\lib\wx\classes\busycursor.rb
a lib\ruby\gems\1.9.1\gems\wxruby-ruby19-2.0.1-x86-mingw32\lib\wx\classes\checklistbox.rb
a lib\ruby\gems\1.9.1\gems\wxruby-ruby19-2.0.1-x86-mingw32\lib\wx\classes\choice.rb
a lib\ruby\gems\1.9.1\gems\wxruby-ruby19-2.0.1-x86-mingw32\lib\wx\classes\clientdc.rb
a lib\ruby\gems\1.9.1\gems\wxruby-ruby19-2.0.1-x86-mingw32\lib\wx\classes\clipboard.rb
a lib\ruby\gems\1.9.1\gems\wxruby-ruby19-2.0.1-x86-mingw32\lib\wx\classes\colour.rb
a lib\ruby\gems\1.9.1\gems\wxruby-ruby19-2.0.1-x86-mingw32\lib\wx\classes\combobox.rb
a lib\ruby\gems\1.9.1\gems\wxruby-ruby19-2.0.1-x86-mingw32\lib\wx\classes\commandevent.rb
a lib\ruby\gems\1.9.1\gems\wxruby-ruby19-2.0.1-x86-mingw32\lib\wx\classes\controlwithitems.rb
a lib\ruby\gems\1.9.1\gems\wxruby-ruby19-2.0.1-x86-mingw32\lib\wx\classes\dataformat.rb
a lib\ruby\gems\1.9.1\gems\wxruby-ruby19-2.0.1-x86-mingw32\lib\wx\classes\data_object.rb
a lib\ruby\gems\1.9.1\gems\wxruby-ruby19-2.0.1-x86-mingw32\lib\wx\classes\data_object_simple.rb
a lib\ruby\gems\1.9.1\gems\wxruby-ruby19-2.0.1-x86-mingw32\lib\wx\classes\dc.rb
a lib\ruby\gems\1.9.1\gems\wxruby-ruby19-2.0.1-x86-mingw32\lib\wx\classes\event.rb
a lib\ruby\gems\1.9.1\gems\wxruby-ruby19-2.0.1-x86-mingw32\lib\wx\classes\font.rb
a lib\ruby\gems\1.9.1\gems\wxruby-ruby19-2.0.1-x86-mingw32\lib\wx\classes\functions.rb
a lib\ruby\gems\1.9.1\gems\wxruby-ruby19-2.0.1-x86-mingw32\lib\wx\classes\gauge.rb
a lib\ruby\gems\1.9.1\gems\wxruby-ruby19-2.0.1-x86-mingw32\lib\wx\classes\genericdirctrl.rb
a lib\ruby\gems\1.9.1\gems\wxruby-ruby19-2.0.1-x86-mingw32\lib\wx\classes\grid.rb
a lib\ruby\gems\1.9.1\gems\wxruby-ruby19-2.0.1-x86-mingw32\lib\wx\classes\hboxsizer.rb
a lib\ruby\gems\1.9.1\gems\wxruby-ruby19-2.0.1-x86-mingw32\lib\wx\classes\helpcontroller.rb
a lib\ruby\gems\1.9.1\gems\wxruby-ruby19-2.0.1-x86-mingw32\lib\wx\classes\simplehelpprovider.rb
a lib\ruby\gems\1.9.1\gems\wxruby-ruby19-2.0.1-x86-mingw32\lib\wx\classes\helpcontrollerhelpprovider.rb
a lib\ruby\gems\1.9.1\gems\wxruby-ruby19-2.0.1-x86-mingw32\lib\wx\classes\helpprovider.rb
a lib\ruby\gems\1.9.1\gems\wxruby-ruby19-2.0.1-x86-mingw32\lib\wx\classes\htmlhelpcontroller.rb
a lib\ruby\gems\1.9.1\gems\wxruby-ruby19-2.0.1-x86-mingw32\lib\wx\classes\htmlwindow.rb
a lib\ruby\gems\1.9.1\gems\wxruby-ruby19-2.0.1-x86-mingw32\lib\wx\classes\icon.rb
a lib\ruby\gems\1.9.1\gems\wxruby-ruby19-2.0.1-x86-mingw32\lib\wx\classes\iconbundle.rb
a lib\ruby\gems\1.9.1\gems\wxruby-ruby19-2.0.1-x86-mingw32\lib\wx\classes\image.rb
a lib\ruby\gems\1.9.1\gems\wxruby-ruby19-2.0.1-x86-mingw32\lib\wx\classes\imagelist.rb
a lib\ruby\gems\1.9.1\gems\wxruby-ruby19-2.0.1-x86-mingw32\lib\wx\classes\listbox.rb
a lib\ruby\gems\1.9.1\gems\wxruby-ruby19-2.0.1-x86-mingw32\lib\wx\classes\listctrl.rb
a lib\ruby\gems\1.9.1\gems\wxruby-ruby19-2.0.1-x86-mingw32\lib\wx\classes\locale.rb
a lib\ruby\gems\1.9.1\gems\wxruby-ruby19-2.0.1-x86-mingw32\lib\wx\classes\mediactrl.rb
a lib\ruby\gems\1.9.1\gems\wxruby-ruby19-2.0.1-x86-mingw32\lib\wx\classes\menu.rb
a lib\ruby\gems\1.9.1\gems\wxruby-ruby19-2.0.1-x86-mingw32\lib\wx\classes\menuitem.rb
a lib\ruby\gems\1.9.1\gems\wxruby-ruby19-2.0.1-x86-mingw32\lib\wx\classes\notebook.rb
a lib\ruby\gems\1.9.1\gems\wxruby-ruby19-2.0.1-x86-mingw32\lib\wx\classes\object.rb
a lib\ruby\gems\1.9.1\gems\wxruby-ruby19-2.0.1-x86-mingw32\lib\wx\classes\paintdc.rb
a lib\ruby\gems\1.9.1\gems\wxruby-ruby19-2.0.1-x86-mingw32\lib\wx\classes\point.rb
a lib\ruby\gems\1.9.1\gems\wxruby-ruby19-2.0.1-x86-mingw32\lib\wx\classes\previewframe.rb
a lib\ruby\gems\1.9.1\gems\wxruby-ruby19-2.0.1-x86-mingw32\lib\wx\classes\rect.rb
a lib\ruby\gems\1.9.1\gems\wxruby-ruby19-2.0.1-x86-mingw32\lib\wx\classes\richtextctrl.rb
a lib\ruby\gems\1.9.1\gems\wxruby-ruby19-2.0.1-x86-mingw32\lib\wx\classes\size.rb
a lib\ruby\gems\1.9.1\gems\wxruby-ruby19-2.0.1-x86-mingw32\lib\wx\classes\sizer.rb
a lib\ruby\gems\1.9.1\gems\wxruby-ruby19-2.0.1-x86-mingw32\lib\wx\classes\sound.rb
a lib\ruby\gems\1.9.1\gems\wxruby-ruby19-2.0.1-x86-mingw32\lib\wx\classes\splitterwindow.rb
a lib\ruby\gems\1.9.1\gems\wxruby-ruby19-2.0.1-x86-mingw32\lib\wx\classes\standardpaths.rb
a lib\ruby\gems\1.9.1\gems\wxruby-ruby19-2.0.1-x86-mingw32\lib\wx\classes\styledtextctrl.rb
a lib\ruby\gems\1.9.1\gems\wxruby-ruby19-2.0.1-x86-mingw32\lib\wx\classes\textctrl.rb
a lib\ruby\gems\1.9.1\gems\wxruby-ruby19-2.0.1-x86-mingw32\lib\wx\classes\texturlevent.rb
a lib\ruby\gems\1.9.1\gems\wxruby-ruby19-2.0.1-x86-mingw32\lib\wx\classes\timer.rb
a lib\ruby\gems\1.9.1\gems\wxruby-ruby19-2.0.1-x86-mingw32\lib\wx\classes\toolbar.rb
a lib\ruby\gems\1.9.1\gems\wxruby-ruby19-2.0.1-x86-mingw32\lib\wx\classes\toolbartool.rb
a lib\ruby\gems\1.9.1\gems\wxruby-ruby19-2.0.1-x86-mingw32\lib\wx\classes\treectrl.rb
a lib\ruby\gems\1.9.1\gems\wxruby-ruby19-2.0.1-x86-mingw32\lib\wx\classes\validator.rb
a lib\ruby\gems\1.9.1\gems\wxruby-ruby19-2.0.1-x86-mingw32\lib\wx\classes\vboxsizer.rb
a lib\ruby\gems\1.9.1\gems\wxruby-ruby19-2.0.1-x86-mingw32\lib\wx\classes\window.rb
a lib\ruby\gems\1.9.1\gems\wxruby-ruby19-2.0.1-x86-mingw32\lib\wx\classes\xmlresource.rb
a lib\ruby\gems\1.9.1\gems\wxruby-ruby19-2.0.1-x86-mingw32\lib\wx\accessors.rb
a lib\ruby\gems\1.9.1\gems\wxruby-ruby19-2.0.1-x86-mingw32\lib\wx\keyword_ctors.rb
a lib\ruby\gems\1.9.1\gems\wxruby-ruby19-2.0.1-x86-mingw32\lib\wx\keyword_defs.rb
a lib\ruby\gems\1.9.1\gems\wxruby-ruby19-2.0.1-x86-mingw32\lib\wx.rb
a lib\ruby\1.9.1\i386-mingw32\zlib.so
a lib\ruby\1.9.1\fileutils.rb
a lib\ruby\1.9.1\i386-mingw32\socket.so
a lib\ruby\1.9.1\timeout.rb
m lib\ruby\1.9.1\net
a lib\ruby\1.9.1\net\protocol.rb
m lib\ruby\1.9.1\uri
a lib\ruby\1.9.1\uri\common.rb
a lib\ruby\1.9.1\uri\generic.rb
a lib\ruby\1.9.1\uri\ftp.rb
a lib\ruby\1.9.1\uri\http.rb
a lib\ruby\1.9.1\uri\https.rb
a lib\ruby\1.9.1\uri\ldap.rb
a lib\ruby\1.9.1\uri\ldaps.rb
a lib\ruby\1.9.1\uri\mailto.rb
a lib\ruby\1.9.1\uri.rb
a lib\ruby\1.9.1\net\http.rb
a lib\ruby\1.9.1\time.rb
a lib\ruby\site_ruby\1.9.1\rubygems\remote_fetcher.rb
a lib\ruby\site_ruby\1.9.1\rubygems\errors.rb
a lib\ruby\site_ruby\1.9.1\rubygems\spec_fetcher.rb
e RUBYOPT
e RUBYLIB
e GEM_PATH  \gemhome
l bin\rubyw.exe rubyw.exe " \src\gui.rb"
=== Compressing
=== Finished (Final size was 5167759)


Danach können wir die fertige Executable ausführen:


gui.exe


Die GUI öffnet sich, aber Output sieht man keinen. Stattdessen wurde eine Logdatei gui.log im selben Verzeichnis wie die Executable erstellt:

1
2
3
Laden der Libs... Fertig.
Erstellen der GUI... Fertig.
Der Button wurde geklickt!


Man erkennt, dass ich einmal den Button gedrückt habe.

Siehe auch