我该如何开始一个新的Perl模块发布?

8
我正在尝试建立一个用Perl编写的较大项目。迄今为止,IBM MakeMaker教程非常有帮助,但我不知道如何将所有模块链接到主程序中。在我的项目根目录下,有MANIFESTMakefile.PLREADME、一个bin目录和一个lib目录。在我的bin目录中,有我的主脚本(Main.pl)。在lib目录中,我有每个模块,分别分成自己的目录(即在utils目录中的Utils::Util1Utils::Utils2等)。在每个模块目录中,还有一个包含测试的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'时,它说没有定义任何测试。有人能给出建议吗?我以前从未在Perl中完成过如此大规模的项目,而我需要添加更多模块。


1
希望对你来说,“Utils::Util1”和“Utils::Util2”只是示例名称。 - innaM
这些只是示例名称。我还没有编写所有我需要的模块,但我想能够构建一些东西。 - Tim
4个回答

13
如果你刚开始创建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获取它。这是我们在Intermediate Perl中使用的工具,因为它很简单。它会用你的信息填充一些模板:

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

如果你需要经常这样做,那么你可以将其转换为Distribution::Cooker,以便您可以自定义文件和内容。这是我为自己编写的一个小型实用程序,因此我可以使用自己的模板。

% dist_cooker Module::Name

如果你真的很专业,你可能会选择Dist::Zilla,但这更适合那些已经知道自己在做什么的人。


9
我还可以建议使用module-starter。它会自动创建一个基本项目,让您可以直接开始使用。通过阅读生成的基础文件,我学到了一些有关Perl模块组织的知识。所有内容都有很好的文档说明,并且非常容易用作扩展更大项目的基础。您可以查看入门文档以了解其功能。

运行module-starter将为您提供一个Perl分发,包括多个模块(使用命令行选项--module),例如:

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

在一个单一的分发包中创建多个模块。然后,你可以选择将项目组织为一个由多个模块共同工作的单一分发包,或者将其组织为多个可以单独发布但相互依赖的分发包(在你的BuildMakefile.PL文件中进行配置),以提供完整的系统。


谢谢。我已经阅读了那篇文章,但没有找到关于如何进行项目的内容,只是关于制作模块的介绍。 - Tim
Tim:我修改了我的回答,以澄清在 Perl 中分发和模块如何共同工作。希望有所帮助?如果我们中有人仍然感到困惑,请修改您的问题或再次回复 :)。 - Gaurav
这似乎是一个非常好的想法,我下一个项目一定会用到它。我已经设置了一个makemaker项目,但这比你最初的帖子更好地回答了我的问题。 - Tim

6

尝试使用这种结构:

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会自动执行此操作。)

2

默认情况下,测试文件应该放在顶层的t目录中(或者是test.pl文件,但这种方式有一些限制,因此应该避免使用)。

你说“在我进行make和run之后”……make会将文件放入blib目录结构中以便安装,但它不会做任何特殊的事情来让脚本能够访问它们。(make test是特殊的,它会将适当的路径从blib添加到perl的@INC中,以便运行测试。)你需要进行“make install”才能安装模块,让你的脚本能够找到它们(或者使用类似PAR这样的工具将它们与你的脚本打包在一起)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接