【问题标题】:How do I start a new Perl module distribution?如何启动新的 Perl 模块分发?
【发布时间】:2010-12-02 12:20:01
【问题描述】:

我正在尝试建立一个用 Perl 编写的大型项目。 IBM MakeMaker tutorial 到目前为止一直很有帮助,但我不明白如何将所有模块链接到主程序中。在我的项目根目录中,我有MANIFESTMakefile.PLREADMEbin 目录和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时,它显示no tests defined。任何人都可以提出任何建议吗?我从来没有在 perl 中做过这样的大型项目,我需要添加更多的模块

【问题讨论】:

  • 我希望“Utils::Util1”和“Utils::Util2”只是示例名称。
  • 它们只是示例名称。我还没有编写我需要的所有模块,但我希望能够构建一些东西。

标签: perl project structure makemaker


【解决方案1】:

如果您刚刚开始创建 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,但这更适合那些已经知道自己在做什么的人。

【讨论】:

    【解决方案2】:

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

    运行 module-starter 会给你一个 Perl 发行版,由许多模块组成(使用命令行选项 --module,例如:

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

    在单个发行版中创建多个模块)。然后由您决定您是否愿意将项目组织为由多个模块一起工作的单个发行版,或者作为可以单独发布但相互依赖的多个发行版(如您在 @ 987654327@或Makefile.PL文件)提供完整的系统。

    【讨论】:

    • 谢谢。我通读了一遍,找不到任何关于做项目的东西,只有关于制作模块的东西
    • Tim:我已经修改了我的答案,以阐明发行版和模块如何在 Perl 中协同工作。希望能帮助到你?如果我们中的一个人仍然感到困惑,请修改您的问题或再次回复:)。
    • 这似乎是一个非常好的主意,我将不得不在我的下一个项目中使用它。我已经建立了一个 makemaker 项目,但这比你最初的帖子更好地回答了我的问题
    【解决方案3】:

    试试这个结构:

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-11-09
        • 2017-07-17
        • 1970-01-01
        • 2021-09-14
        • 2020-01-13
        • 1970-01-01
        • 2015-07-27
        相关资源
        最近更新 更多