2009-09-30 14 views
7

Estoy tratando de configurar un proyecto de gran tamaño, escrito en Perl. El IBM MakeMaker tutorial ha sido muy útil hasta ahora, pero no entiendo cómo vincular todos los módulos al programa principal. En mi raíz de proyecto, tengo MANIFEST, Makefile.PL, README, un directorio bin y un directorio lib. En mi directorio bin, tengo mi script principal (Main.pl). En el directorio lib, tengo cada uno de mis módulos, divididos en sus respectivos directorios (es decir, Utils::Util1 y Utils::Utils2 en el directorio utils, etc.). En cada directorio de módulos, también hay un directorio t, que contiene pruebas¿Cómo comienzo una nueva distribución de módulos Perl?

Mi archivo MANIFEST tiene las siguientes:

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 es la siguiente:

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

Después de hacer y ejecutar, el programa se bloquea, quejándose de que no puede encontrar Utils::Util1, y cuando ejecuto 'make test, dice no tests defined. ¿Alguien puede hacer alguna sugerencia? Nunca he hecho un proyecto a gran escala como este en Perl, y tendré que agregar muchos más módulos

+1

Espero que "Utils :: Util1" y "Utils :: Util2" sean sólo ejemplos de nombres. – innaM

+0

Son solo nombres de ejemplo. Aún no he escrito todos los módulos que voy a necesitar, pero quería poder construir algo. – Tim

Respuesta

5

Pruebe esta estructura:

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

Como ysth dijo, make no instala sus módulos, sólo se las construye en un directorio blib. (En su caso, simplemente los copia allí, pero si tiene el código XS, se compilará con un compilador de C.) Use make install para instalar sus módulos para que usen los scripts normales.

Si desea ejecutar la secuencia de comandos entre make y make install, que puede hacer:

perl -Mblib bin/Main.pl 

El -Mblib instruye Perl para agregar temporalmente los directorios correspondientes a la ruta de búsqueda, por lo que puede probar un módulo no instalado . (make test lo hace automáticamente.)

2

Por defecto, las pruebas se buscan en un directorio t de nivel superior (o un archivo test.pl, pero que tiene algunas limitaciones, por lo que debe evitarse).

Dice "Después de hacer y ejecutar" ... make pone las cosas en una estructura de directorio blib lista para ser instalada, pero no hace nada especial para hacer que ejecutar un script acceda a ellas. (la prueba make es especial; agrega rutas apropiadas desde blib a @INC de perl para poder ejecutar las pruebas). Tendrá que hacer una "instalación" para instalar los módulos donde su script los encontrará (o usar un herramienta como PAR para empaquetarlos junto con su secuencia de comandos).

9

¿Puedo sugerir module-starter? Automáticamente creará un proyecto de esqueleto que "solo funciona". Aprendí lo poco que sé sobre la organización de los módulos Perl leyendo los esqueletos generados. Está todo bien documentado y es bastante fácil de usar como base para hacer crecer un proyecto más grande. Puedes consultar the getting-started docs para ver lo que te ofrece.

Correr module-starter le dará una distribución de Perl, que consiste en una serie de módulos (utilice la línea de comandos opción --module, tales como:

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

para crear varios módulos en una sola distribución). Depende de usted si prefiere organizar su proyecto como una distribución única que consiste en una serie de módulos que trabajan juntos, o como un número de distribuciones que se pueden liberar por separado pero que dependen el uno del otro (como se configura en su Build o archivo Makefile.PL) para proporcionar un sistema completo.

+0

Gracias. Lo leí y no pude encontrar nada sobre cómo hacer proyectos, solo sobre hacer módulos – Tim

+0

Tim: He modificado mi respuesta para aclarar cómo las distribuciones y los módulos pueden funcionar juntos en Perl. ¿Espero eso ayude? Por favor, modifique su pregunta o responda de nuevo si uno de nosotros todavía está confundido :). – Gaurav

+0

Esto parece una muy buena idea, y tendré que usarlo para mi próximo proyecto. Ya monté un proyecto Makemaker, pero esto responde mi pregunta mucho mejor que tu publicación inicial – Tim

13

Si recién está empezando a crear módulos Perl (que también es el equivalente de Perl de un proyecto), no use Makemaker. Module::Build es el camino a seguir, y ahora es parte de la biblioteca estándar. Makemaker es para nosotros las sales antiguas que aún no se han convertido a Module :: Build. :) Voy a golpear eso ahora que Module::Build no se ha mantenido y está en desacuerdo; Todavía uso MakeMaker.

Nunca debe comenzar un proyecto de Perl tratando de crear la estructura usted mismo. Es demasiado trabajo y siempre olvidarás algo.

Hay h2xs, un programa que viene con perl y se supone que es una herramienta para convertir .h archivos en lenguaje Perl pegamento de XS. Funciona bien, pero su ventaja es que viene con perl:

% h2xs -AXn Module::Name 

Algo así como Module::Starter es un poco más sofisticado, aunque hay que obtenerlo de CPAN. Es la herramienta que usamos en Intermediate Perl porque es simple. Se llena en algunas plantillas con su información:

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

Si usted está haciendo para hacer esto un poco, es posible que luego convertir a que Distribution::Cooker para que pueda personalizar sus archivos y contenidos. Es una utilidad pequeña que escribí para mí misma, así que podría usar mis propias plantillas.

% dist_cooker Module::Name 

Si eres núcleo muy duro, es posible que desee Dist::Zilla, pero eso es más para las personas que ya saben lo que están haciendo.

Cuestiones relacionadas