Как мне запустить новый дистрибутив модуля Perl?

Я пытаюсь создать большой проект, написанный на Perl. руководство по IBM MakeMaker до сих пор было очень полезным, но я не понимаю, как связать все модули в основную программу. В корне моего проекта у меня есть MANIFEST, Makefile.PL, README, каталог bin и каталог lib. В моем каталоге bin у меня есть основной скрипт (Main.pl). В каталоге lib каждый из моих модулей разделен на соответствующие каталоги (например, Utils::Util1 и Utils::Utils2 в каталоге utils и т. д.). В каждом каталоге модулей также есть каталог t, содержащий тесты.

Мой файл MANIFEST имеет следующее:

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 это следующее:

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

После того, как я делаю и запускаю, программа вылетает, жалуясь, что не может найти Utils::Util1, а когда запускаю 'make test, пишет no tests defined. Может ли кто-нибудь сделать какие-либо предложения? Я никогда не делал такого масштабного проекта на Perl, и мне нужно будет добавить еще много модулей.


person Tim    schedule 30.09.2009    source источник
comment
Я надеюсь на то, что Utils::Util1 и Utils::Util2 — это просто примеры имен.   -  person innaM    schedule 30.09.2009
comment
Это просто примеры имен. Я еще не написал все модули, которые мне понадобятся, но я хотел иметь возможность что-то построить.   -  person Tim    schedule 30.09.2009


Ответы (4)


Попробуйте эту структуру:

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

Как сказал ysth, make не устанавливает ваши модули, а просто создает их в каталоге blib. (В вашем случае он просто копирует их туда, но если бы у вас был код XS, он был бы скомпилирован компилятором C.) Используйте make install для установки ваших модулей для использования обычными скриптами.

Если вы хотите запустить свой скрипт между make и make install, вы можете сделать:

perl -Mblib bin/Main.pl

-Mblib инструктирует Perl временно добавить соответствующие каталоги в путь поиска, чтобы вы могли попробовать удаленный модуль. (make test делает это автоматически.)

person cjm    schedule 30.09.2009

Если вы только начинаете создавать модули Perl (которые также являются Perl-эквивалентом проекта), не используйте Makemaker. Module::Build — это то, что нужно, и теперь он является частью стандартной библиотеки. Makemaker — это для нас, старых солей, которые еще не перешли на Module::Build. :) Я замечу, что теперь Module::Build не поддерживается и в немилости; Я до сих пор использую MakeMaker.

Вы никогда не должны начинать проект Perl, пытаясь создать структуру самостоятельно. Это слишком много работы, и вы всегда что-нибудь забудете.

Есть h2xs, программа, которая поставляется с perl и должна была стать инструментом для преобразования файлов .h в связующий язык Perl XS. Он отлично работает, но его преимущество в том, что он поставляется с perl:

% h2xs -AXn Module::Name

Что-то вроде Module::Starter немного сложнее, хотя вы должны его получить из КПАН. Это инструмент, который мы используем в Intermediate Perl, потому что он прост. Он заполняет некоторые шаблоны вашей информацией:

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

Если вы делаете это совсем немного, вы можете преобразовать его в Distribution::Cooker, чтобы вы могли настроить свои файлы и содержимое. Это изящная утилита, которую я написал для себя, чтобы использовать свои собственные шаблоны.

% dist_cooker Module::Name

Если вы действительно хардкорщик, вам может понадобиться Dist::Zilla, но это больше для людей, которые уже знают, что они делают.

person brian d foy    schedule 30.09.2009

Могу ли я также предложить module-starter? Он автоматически создаст каркас проекта, который «Просто работает». То немногое, что я знаю об организации модулей Perl, я узнал, прочитав сгенерированные скелетные файлы. Все это хорошо задокументировано, и его довольно легко использовать в качестве основы для расширения более крупного проекта. Вы можете проверить документация по началу работы, чтобы узнать, что она вам дает.

Запуск module-starter даст вам дистрибутив Perl, состоящий из нескольких модулей (используйте параметр командной строки --module, например:

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

для создания нескольких модулей в одном дистрибутиве). Тогда вам решать, предпочтете ли вы организовать свой проект как единый дистрибутив, состоящий из нескольких модулей, работающих вместе, или как ряд дистрибутивов, которые могут быть выпущены отдельно, но которые зависят друг от друга (как настроено в вашем Build или файл Makefile.PL), чтобы обеспечить полную систему.

person Gaurav    schedule 30.09.2009
comment
Спасибо. Я прочитал это и ничего не нашел о создании проектов, только о создании модулей. - person Tim; 30.09.2009
comment
Тим: я изменил свой ответ, чтобы прояснить, как дистрибутивы и модули могут работать вместе в Perl. Надеюсь, поможет? Пожалуйста, измените свой вопрос или ответьте еще раз, если кто-то из нас все еще в замешательстве :). - person Gaurav; 01.10.2009
comment
Это кажется действительно хорошей идеей, и мне придется использовать ее для моего следующего проекта. Я уже создал проект Makemaker, но это отвечает на мой вопрос намного лучше, чем ваш первоначальный пост. - person Tim; 01.10.2009

По умолчанию тесты ищутся в каталоге t верхнего уровня (или в файле test.pl, но у него есть некоторые ограничения, поэтому его следует избегать).

Вы говорите: «После того, как я создам и запущу»… make помещает вещи в структуру каталогов blib, готовую к установке, но не делает ничего особенного, чтобы запустить скрипт для доступа к ним. (make test особенный; он добавляет соответствующие пути от blib к @INC perl, чтобы иметь возможность запускать тесты.) Вам нужно будет выполнить «make install», чтобы установить модули, где ваш скрипт их найдет (или используйте такой инструмент, как PAR, чтобы упаковать их вместе с вашим скриптом).

person ysth    schedule 30.09.2009