如何开始新的Perl模块分发?

时间:2009-09-30 01:09:10

标签: perl project structure makemaker

我正在尝试建立一个用Perl编写的大型项目。 IBM MakeMaker tutorial到目前为止一直非常有用,但我不明白如何将所有模块链接到主程序中。在我的项目根目录中,我有MANIFESTMakefile.PLREADMEbin目录和lib目录。在我的bin目录中,我有我的主脚本(Main.pl)。在lib目录中,我有我的每个模块,分为各自的目录(即Utils::Util1目录中的Utils::Utils2utils等。在每个模块目录中,还有一个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 个答案:

答案 0 :(得分:13)

如果您刚刚开始创建Perl模块(也是Perl相当于一个项目),请不要使用Makemaker。 Module::Build是要走的路,它现在是标准库的一部分。 Makemaker适用于尚未转换为Module :: Build的旧盐。 :)我会发现Module::Build没有维护而且不受欢迎;我仍然使用MakeMaker。

您永远不应该尝试自己创建结构来启动Perl项目。这是太多的工作,你总会忘记一些事情。

h2xsperl附带的程序,应该是将 .h 文件转换为Perl的胶水语言XS的工具。它工作正常,但它的优点是它带有perl

% h2xs -AXn Module::Name

Module::Starter这样的东西有点复杂,尽管你必须从CPAN获得它。这是我们在Intermediate Perl中使用的工具,因为它很简单。它会在您的信息中填写一些模板:

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

如果您要这么做,可以将其转换为Distribution::Cooker,以便自定义文件和内容。这是我为自己写的一个很小的实用工具,所以我可以使用自己的模板。

% dist_cooker Module::Name

如果你真的很难,你可能需要Dist::Zilla,但对那些已经知道自己在做什么的人来说更是如此。

答案 1 :(得分:9)

我可以建议module-starter吗?它会自动创建一个“Just Works”的骨架项目。我通过阅读生成的骨架文件了解了我对Perl模块组织的了解。这些都是有充分记录的,并且很容易用作开发更大项目的基础。您可以查看the getting-started docs以查看它为您提供的内容。

运行module-starter将为您提供Perl发行版,其中包含许多模块(使用命令行选项--module,例如:

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

在单个发行版中创建多个模块)。无论您是希望将项目组织为由多个模块协同工作组成的单个发行版,还是作为一些可以单独发布但相互依赖的发行版(在您的{中配置),由您决定。 {1}}或Build文件)提供完整的系统。

答案 2 :(得分:5)

试试这个结构:

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安装模块以供常规脚本使用。

如果您想在makemake install之间运行脚本,可以执行以下操作:

perl -Mblib bin/Main.pl

-Mblib指示perl临时将相应的目录添加到搜索路径,以便您可以尝试卸载的模块。 (make test会自动执行此操作。)

答案 3 :(得分:2)

默认情况下,在顶级t目录(或test.pl文件中)中查找测试,但这有一些限制,因此应该避免。

你说“在我制作并运行之后”... make将东西放入blib目录结构中,准备安装,但没有做任何特别的事情来让运行脚本访问它们。 (make test是特殊的;它确实添加了从blib到perl的@INC的适当路径,以便能够运行测试。)你需要做一个“make install”来安装脚本会找到它们的模块(或者使用一个像PAR这样的工具将它们与你的脚本一起打包)。