2009-09-30 6 views
7

J'essaye de mettre en place un projet de grande taille, écrit en Perl. Le IBM MakeMaker tutorial a été très utile jusqu'à présent, mais je ne comprends pas comment lier tous les modules dans le programme principal. Dans ma racine de projet, j'ai MANIFEST, Makefile.PL, README, un répertoire bin et un répertoire lib. Dans mon répertoire bin, j'ai mon script principal (Main.pl). Dans le répertoire lib, j'ai chacun de mes modules, répartis dans leurs propres répertoires respectifs (c'est-à-dire Utils::Util1 et Utils::Utils2 dans le répertoire utils, etc.). Dans chaque répertoire du module, il y a aussi un répertoire t, contenant des testsComment démarrer une nouvelle distribution de module Perl?

Mon fichier MANIFEST a les suivantes:

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 est la suivante:

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")] 
); 

Après que je fais et courir, le programme se bloque, se plaignant qu'il ne peut pas trouver Utils::Util1, et quand je cours 'make test, il dit no tests defined. Quelqu'un peut-il faire des suggestions? Par défaut, je n'ai jamais fait un projet à grande échelle comme ça dans perl, et je vais devoir ajouter beaucoup plus de modules

+1

J'espère pour vous que "Utils :: Util1" et "Utils :: Util2" ne sont que des exemples. – innaM

+0

Ce ne sont que des exemples de noms. Je n'ai pas encore écrit tous les modules dont j'ai besoin, mais je voulais être capable de construire quelque chose. – Tim

Répondre

5

Essayez cette structure:

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

Comme ysth dit, make n'installe pas vos modules, il les construit juste dans un répertoire blib. (Dans votre cas, il suffit de les copier ici, mais si vous aviez du code XS, il serait compilé avec un compilateur C.) Utilisez make install pour installer vos modules pour les scripts standard à utiliser.

Si vous voulez exécuter votre script entre make et make install, vous pouvez faire:

perl -Mblib bin/Main.pl 

Le -Mblib indique à Perl d'ajouter temporairement les répertoires appropriés au chemin de recherche, de sorte que vous pouvez essayer un module désinstallés . (make test le fait automatiquement.)

2

Par défaut, les tests sont recherchés dans un répertoire t de haut niveau (ou un fichier test.pl, mais a quelques limitations, donc devrait être évité). Vous dites "Après avoir créé et exécuté" ... make met les choses dans une structure de répertoire blib prête à être installée, mais ne fait rien de spécial pour que l'exécution d'un script y accède. (make test est spécial, il ajoute des chemins appropriés de blib à @INC de perl pour pouvoir exécuter les tests.) Vous devrez faire un "make install" pour installer les modules où votre script les trouvera (ou utilisez un outil comme PAR pour les empaqueter avec votre script).

9

Puis-je également suggérer module-starter? Il va automatiquement créer un projet de squelette qui "fonctionne". J'ai appris peu de choses sur l'organisation des modules Perl en lisant les fichiers squelettes générés. Tout cela est bien documenté, et assez facile à utiliser comme base pour la croissance d'un plus grand projet. Vous pouvez consulter the getting-started docs pour voir ce qu'il vous donne.

L'exécution module-starter vous donnera une distribution Perl, composé d'un certain nombre de modules (utilisez l'option de ligne de commande --module, tels que:

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

pour créer plusieurs modules dans une seule distribution). C'est alors à vous de décider si vous préférez organiser votre projet sous la forme d'une distribution unique composée d'un certain nombre de modules fonctionnant ensemble ou d'un nombre de distributions qui peuvent être libérées séparément mais qui dépendent l'une de l'autre (Build ou Makefile.PL fichier) pour fournir un système complet.

+0

Merci. J'ai lu cela et je n'ai rien trouvé à propos de faire des projets, seulement de faire des modules – Tim

+0

Tim: J'ai modifié ma réponse pour clarifier comment les distributions et les modules peuvent fonctionner ensemble en Perl. J'espère que cela aide? S'il vous plaît ne modifiez votre question ou répondez à nouveau si l'un de nous est encore confus :). – Gaurav

+0

Cela semble être une très bonne idée, et je vais devoir l'utiliser pour mon prochain projet. J'ai déjà mis en place un projet de makemaker, mais cela répond à ma question beaucoup mieux que votre message initial – Tim

13

Si vous commencez simplement à créer des modules Perl (qui est également l'équivalent de Perl d'un projet), n'utilisez pas Makemaker. Module::Build est le chemin à parcourir, et il fait maintenant partie de la bibliothèque standard. Makemaker est pour nous les vieux sels qui n'ont pas encore été convertis en Module :: Build. :) Je frapperai cela maintenant que Module::Build est non maintenu et hors de la faveur; J'utilise toujours MakeMaker.

Vous ne devez jamais démarrer un projet Perl en essayant de créer la structure vous-même. C'est trop de travail et tu oublieras toujours quelque chose.

Il y a h2xs, un programme qui vient avec perl et était censé être un outil pour convertir .h fichiers dans la langue de la colle de Perl XS. Il fonctionne très bien, mais son avantage est qu'il est livré avec perl:

% h2xs -AXn Module::Name 

Quelque chose comme Module::Starter est un peu plus sophistiqué, bien que vous devez obtenir de CPAN. C'est l'outil que nous utilisons dans Intermediate Perl parce que c'est simple. Il remplit certains modèles avec vos informations:

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

Si vous faites pour faire un peu, vous pourriez alors convertir en Distribution::Cooker de sorte que vous pouvez personnaliser vos fichiers et contenus. C'est un utilitaire dinky que j'ai écrit pour moi-même afin que je puisse utiliser mes propres modèles.

% dist_cooker Module::Name 

Si vous êtes noyau vraiment dur, vous voudrez peut-être Dist::Zilla, mais c'est plus pour les gens qui savent déjà ce qu'ils font.

Questions connexes