Wie erzeuge ich eine ausführbare Datei mit Tinyperl?

Inhalt:

Tinyperl

Tinyperl ist eine sehr kleine Perl-Distribution, in welcher benötigte Module nicht nur in Ordnern liegen können, sondern auch in einem Zip-Archiv namens lib.zip. Außer lib.zip werden auch noch die perl58.dll und die tinyperl.exe(und das Perl-Script) bzw die von Tinyperl erzeugte exe(ohne Perl-Script) benötigt.

Installation

Um Tinyperl zu verwenden, lädt man es einfach als Archiv von der Tinyperl-Homepage und entpackt es.

Ausführbare Datei erstellen

~/>tinyperl -bin -o script.pl programm.exe

bzw. bei Andwendungen ohne Konsolenfenster:

~/>tinyperl -bin -gui -o script.pl programm.exe

Anmerkung: Executables sind erst ab Version 2.0 erzeugbar!

Executable ausführen

Bei Windows reicht ein Doppelklick auf die .exe.

Am einfachsten startet man das Programm in der Kommandozeile:
./test.exe

Vorhandene lib.zip durch Standard-Module beinhaltende lib.zip ersetzen

Da in der Standard Ausführung von Tinyperl in der lib.zip nur die sehr oft benötigten Module enthalten sind, ist es nötig eine lib.zip mit allen benötigten Modulen zu erzeugen. Es reicht hierzu den Inhalt der Verzeichnisse lib/ und site/lib/ im Perl-Installationsverzeichnis zusammenzuführen und als Zip zu archivieren. Diese Zip-Datei ist dann noch in lib.zip umzubenennen. ACHTUNG: Tinyperl ist aus Perl5.8.0 erzeugt. Es ist somit nötig, Module zu verwenden, die unter Perl5.8.0 laufen. Des weiteren muss die lib.zip nach dem Schema lib.zip/lib/module aufgebaut sein. Die Module müssen also unter dem Pfad lib/ komprimiert werden, nicht direkt unter lib.zip.

Kleinstmögliche lib.zip erzeugen

Um eine kleinstmögliche lib.zip zu erzeugen, ist es nötig, nur jene Module in die lib.zip zu packen, welche auch benötigt werden. Dies ist dadurch zu erreichen, dass man das Skript einfach unter Benutzung der bereits erwähnten lib.zip, welche alle Standardmodule beinhaltet, ausführt. Während der Ausführung öffnet man den Ordner libzip-temp und komprimiert den dort vorhandenen Ordner lib. Das so erzeugte Archiv muss vor Beendigung des Skriptes aus dem Ordner libzip-temp entfernt werden, da es sonst genau wie der restliche Inhalt dieses Ordners von Tinyperl aufgeräumt(=gelöscht) wird. Bei Skripten mit sehr kurzer Auführungszeit ist am Ende des Skripts einfach ein "sleep(20);" oder ähnliches anzuhängen. Bevor man dann eine Exe erzeugt oder das Skript mit Tinyperl verbreitet ist dies natürlich wieder zu entfernen.

...mit einem kleinen Skript erzeugen

Ich habe mal ein kleines Skript geschrieben, mit dem es möglich sein sollte, die kleinstmögliche lib.zip zu erstellen (ich habe es mal tinylib.pl genannt). Es nutzt das Modul Module::ScanDeps

#!/usr/bin/perl

use strict;
use warnings;
use Module::ScanDeps;
use Archive::Zip qw( :ERROR_CODES :CONSTANTS );

my $hashref = scan_deps($ARGV[0]);

my $zip = Archive::Zip->new();
$zip->addDirectory('lib/');

for my $key(keys(%$hashref)){
  $zip->addFile($hashref->{$key}->{file},'lib/'.$key);
}

die 'write error' unless $zip->writeToFileNamed( 'lib.zip' ) == AZ_OK;

Einfach mit tinylib.pl skript.pl aufrufen. skript.pl ist das Skript, das dann in eine .exe gepackt werden soll.

-- ReneeBaecker 22 Dec 2005

Probleme und Fehler

Sind mir keine bekannt.

Links

http://tinyperl.sourceforge.net/

Erfahrungen

Erzeugte Executables(samt lib.zip und perl58.dll) sind kleiner und werden schneller ausgeführt als von PAR erzeugte. Ein Artikel mit Benchmarks und Größenvergleichen von PAR und Tinyperl wird demnächst folgen.

Ein Perfomancevergleich zwischen Scriptausführung mit ActiveState? PERL Interpreten (I.) und einer durch TinyPerl? erzeugten ausführbaren Datei (II.) zeigte ein überraschendes Ergebnis: Die Anlaufzeit des Programmes, also die Zeit zwischen Programmstart und Ausführung, ist im Fall der vorkompilierten Datei (II.) deutlich länger (Faktor 4-8). Das der PERL-Interpreter hier also deutlich früher zur Sache geht, scheint im Widerspruch zu liegen. Die offensichtliche Vorgehensweise des TinyPerl? Kompilats zeigt den Grund: Tinyperl kompiliert nur die ausgeführte Datei, also zum Beispiel test.pl. Die Module, die durch dieses Programm eingebunden werden, werden NICHT kompiliert! Diese sucht dann das Kompilat in der lib.zip, die aus dem Grund immer mit dem EXE Programm mitgeliefert werden muss. Das gefundene Modul wird also on-demand in das oben genannte temporäre Verzeichnis entpackt, kompiliert und ausgeführt. Das Entpacken und Speichern aller eingebundenen Module kann sich der Perl Interpreter sparen, da die Dateien ja eh in Ausgangsform vorliegen. Aus der Mehrarbeit ergibt sich als logische Konsequenz die längere Anlaufzeit.

Hiermit bleibt (vorerst) der entscheidende Grund, eine solche ausführbare Datei zu erzeugen, darin, ein Programm auf Windows-Umgebungen auch ohne eine lokale PERL-Distribution lauffähig zu halten. Dafür muss man halt leichte Einbußen beim Laden in Kauf nehmen.

Die Ausführungsgeschwindigkeit beider Fälle I. und II. ist identisch, da beide Programme wohl sehr ähnlichen Binärcode verwenden. -- ArKo 21 Jan 2006

Da TinyPerl? eine Reihe eigener Parameter verwendet, ist eine Parameterübergabe an das Script, wie z.B. programm.exe -T=123, leider nicht möglich. -- NilsMeffert 28 Jun 2007

Ergänzungen, Kommentare

Kommentare werden am besten in folgender Form vorgenommen, damit sie im Inhaltsverzeichnis angezeigt werden (natürlich ohne das <verbatim>):
---+++ Main.??? - 14 Jul 2003 - Betreff

UtilFaqSubForm edit

Titel Wie erzeuge ich eine ausführbare Datei mit Tinyperl?
Autor MaxVoit
Bereich FaqAllgemeines
Tags
Topic revision: r6 - 2007-07-03 - 00:54:10 - MartinVonOertzen
 
Bitte die NutzungsBedingungen beachten.
Bei Vorschlägen, Anfragen oder Problemen mit dem PerlCommunityWiki bitten wir um WebBottomBarExample">Rückmeldung.