2009-09-30 5 views
7

Ich versuche ein großartiges Projekt in Perl zu erstellen. Die IBM MakeMaker tutorial war bisher sehr hilfreich, aber ich verstehe nicht, wie man alle Module in das Hauptprogramm einbindet. In meinem Projekt root habe ich MANIFEST, Makefile.PL, README, ein bin Verzeichnis und ein Verzeichnis lib. In meinem Verzeichnis bin habe ich mein Hauptskript (Main.pl). Im lib Verzeichnis habe ich jedes meiner Module in seine eigenen entsprechenden Verzeichnisse aufgeteilt (d. H. Utils::Util1 und Utils::Utils2 im Verzeichnis utils, usw.). In jedem Modul-Verzeichnis gibt es auch ein t Verzeichnis enthält TestsWie starte ich eine neue Perl-Modul-Distribution?

Meine MANIFEST Datei hat die folgende:

bin/Main.pl 
lib/Utils/Util1.pm 
lib/Utils/Util2.pm 
lib/Utils/t/Utils1.t 
lib/Utils/t/Utils2.t 
Makefile.PL 
MANIFEST 
README 

Makefile.PL ist die folgende:

use ExtUtils::MakeMaker; 
WriteMakefile(
    'NAME'=>'Foo', 
    'VERSION_FROM'=>'bin/Main.pl', 
    'PREREQ_PM'=>{ 
    "XML::Simple"=> 2.18}, #The libraries that we need and their 
        #minimum version numbers 
    'EXE_FILES' =>[("bin/Main.pl")] 
); 

Nachdem ich machen und laufen, Das Programm stürzt ab und beschwert sich, dass es Utils::Util1 nicht finden kann, und wenn ich 'make test rufe, heißt es no tests defined. Kann jemand irgendwelche Vorschläge machen? Ich habe noch nie ein großangelegtes Projekt in Perl gemacht, und ich werde viel mehr Module hinzufügen müssen

+1

Ich hoffe für Sie, dass "Utils :: Util1" und "Utils :: Util2" nur Beispielnamen sind. – innaM

+0

Sie sind nur Beispielnamen. Ich habe noch nicht alle Module geschrieben, die ich brauche, aber ich wollte etwas bauen können. – Tim

Antwort

5

diese Struktur Versuchen:

bin/Main.pl 
lib/Utils/Util1.pm 
lib/Utils/Util2.pm 
Makefile.PL 
MANIFEST 
README 
t/Utils1.t 
t/Utils2.t 

Wie ysth sagte make nicht Ihre Module nicht installieren, es baut sie nur in einem blib Verzeichnis. (In Ihrem Fall kopiert es sie nur dort, aber wenn Sie XS-Code hätten, würde es mit einem C-Compiler kompiliert werden.) Verwenden Sie make install, um Ihre Module für reguläre Skripte zu installieren.

Wenn Sie Ihr Skript zwischen make und make install ausführen möchten, können Sie tun:

perl -Mblib bin/Main.pl 

Die -Mblib Perl weist die entsprechenden Verzeichnisse auf dem Suchpfad vorübergehend hinzuzufügen, so können Sie eine deinstallierte Modul ausprobieren . (make test macht das automatisch.)

2

Standardmäßig werden Tests in einem Top-Level-t-Verzeichnis gesucht (oder einer test.pl-Datei, aber das hat einige Einschränkungen, sollte also vermieden werden).

Sie sagen "Nachdem ich make and run" ... make bringt Dinge in eine blib-Verzeichnisstruktur, die bereit ist, installiert zu werden, macht aber nichts Besonderes, um den Skriptzugriff auf sie zu ermöglichen. (make test ist etwas Besonderes; es fügt entsprechende Pfade von blib zu @INCs von Perl hinzu, um die Tests ausführen zu können.) Sie müssen eine "make install" durchführen, um die Module zu installieren, in denen Ihr Skript sie finden wird Werkzeug wie PAR, um sie zusammen mit Ihrem Skript zu packen).

9

Darf ich auch vorschlagen module-starter? Es wird automatisch ein Skelettprojekt erstellt, das "funktioniert". Ich habe gelernt, was ich über die Organisation von Perlmodulen weiß, indem ich die generierten Skelettdateien lese. Es ist alles gut dokumentiert und recht einfach als Basis für ein größeres Projekt zu verwenden. Sie können the getting-started docs auschecken, um zu sehen, was es Ihnen gibt.

module-starter ausführen, werden Ihnen eine Perl-Distribution geben, bestehend aus einer Anzahl von Modulen (verwenden Sie die Befehlszeilenoption --module, wie zum Beispiel:

module-starter --distro=Project --module=Project::Module::A,Project::Module::B [...] 

mehrere Module in einer einzigen Verteilung zu schaffen). Es liegt nun an Ihnen, ob Sie Ihr Projekt lieber als eine einzelne Distribution aus mehreren miteinander arbeitenden Modulen oder als eine Anzahl von Distributionen organisieren möchten, die separat veröffentlicht werden können, aber voneinander abhängen (wie in Ihrer Build konfiguriert) oder Makefile.PL Datei), um ein komplettes System bereitzustellen.

+0

Danke. Ich las das durch und konnte nichts über Projekte finden, sondern nur über Module – Tim

+0

Tim: Ich habe meine Antwort geändert, um zu verdeutlichen, wie Verteilungen und Module in Perl zusammenarbeiten können. Ich hoffe es hilft? Bitte ändern Sie Ihre Frage oder antworten Sie erneut, wenn einer von uns immer noch verwirrt ist :). – Gaurav

+0

Das scheint eine wirklich gute Idee zu sein, und ich werde es für mein nächstes Projekt verwenden müssen. Ich habe bereits ein Makemaker-Projekt eingerichtet, aber das beantwortet meine Frage viel besser als dein ursprünglicher Post – Tim

13

Wenn Sie gerade damit beginnen, Perl-Module zu erstellen (was auch Perls Äquivalent eines Projekts ist), verwenden Sie Makemaker nicht. Module::Build ist der Weg zu gehen, und es ist jetzt ein Teil der Standard-Bibliothek. Makemaker ist für uns alte Salze, die noch nicht zu Module :: Build konvertiert sind. :) Ich werde das jetzt streichen, dass Module::Build ist nicht gepflegt und in Ungnade; Ich benutze immer noch MakeMaker.

Sie sollten niemals ein Perl-Projekt starten, indem Sie versuchen, die Struktur selbst zu erstellen. Es ist zu viel Arbeit und du wirst immer etwas vergessen.

Es gibt h2xs, ein Programm, das mit perl kommt und sollte ein Werkzeug sein .h Dateien in Leim Sprache XS Perl zu konvertieren. Es funktioniert gut, aber sein Vorteil ist, dass es mit perl kommt:

% h2xs -AXn Module::Name 

So etwas wie Module::Starter ist ein bisschen anspruchsvoll, obwohl man es von CPAN bekommen haben. Es ist das Werkzeug, das wir in Intermediate Perl verwenden, weil es einfach ist. Es füllt in einigen Vorlagen mit Ihrer Information:

% module-starter --author=... --email=... --module=... 

Wenn Sie tun dies ziemlich viel zu tun, könnte man dann, dass zu Distribution::Cooker konvertieren, so können Sie Ihre Dateien und Inhalte anpassen. Es ist ein dinky Dienstprogramm, das ich für mich selbst schrieb, damit ich meine eigenen Vorlagen verwenden konnte.

% dist_cooker Module::Name 

Wenn Sie wirklich harte Kern sind, möchten Sie vielleicht Dist::Zilla, aber das ist mehr für Leute, die bereits wissen, was sie tun.