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

Я пытаюсь создать большой проект, написанный на Perl. Учебное пособие по IBM MakeMaker до сих пор было очень полезным, но я не понимаю, как связать все модули в основную программу. В моем проекте root, у меня есть 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, и мне нужно будет добавить еще много модулей.

4 ответа

Решение

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

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

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

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

perl -Mblib bin/Main.pl

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

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

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

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

% h2xs -AXn Module::Name

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

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

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

% dist_cooker Module::Name

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

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

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

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

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

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

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

Другие вопросы по тегам