Как начать новый дистрибутив модуля 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, чтобы упаковать их вместе с вашим скриптом).