编写模块的最佳框架是什么—— ExtUtils::MakeMaker (h2xs) 或Module::Build?
11 回答
注意此建议已过时。 Module::Build 已从 Perl 核心中删除,但仍作为 CPAN 模块存在。优点和缺点仍然存在,我对 MakeMaker 的看法仍然存在。
作为 ExtUtils::MakeMaker 的前维护者,我喜欢推荐 Module::Build,因为 MakeMaker 是一个恐怖节目。Module::Build 放在一起要好得多。但这些不是你关心的问题,我会提出我的“对你来说最不麻烦”的答案。
执行摘要:
因为 Module::Build 支持并不是 100% 通过 Perl 实现的,所以从 MakeMaker 开始。如果您想进行任何自定义,请切换到 Module::Build。由于它们的基本布局、选项和界面几乎相同,这将是无痛的。尽管看起来很诱人,但请避免使用 Module::Install。
幸运的是,Module::Build 可以模拟 MakeMaker,这对某些人有帮助,但如果您要进行任何自定义,则无济于事。请参阅模块::Build::Compat。
对于使用 Module::Build 的 CPAN 版本很好。现在已经在 CPAN 上构建了足够多的 Module::Build 东西,每个人都已经开始着手处理它了。
最后,新configure_requires
选项让 CPAN shell 在开始构建模块之前知道安装 Module::Build。不幸的是,只有最新的 CPAN shell 知道 configure_requires。
哦,无论你做什么都不要使用 h2xs(除非你正在编写 XS 代码……然后再考虑一下)。
MakeMaker 优点:
- 与 Perl 一起提供并由 Perl 核心使用(因此它被积极维护并将永远保持下去)
- 一切都知道如何处理 Makefile.PL。
- 大多数模块创作文档将涵盖 MakeMaker。
- 使用make(知道make的人可以调试和修补构建过程)
MakeMaker 缺点:
- 需要make(想想Windows)
- 难以定制
- 更难定制和跨平台
- 出现问题时难以调试(除非您了解 make)
模块::构建优点:
- 更容易定制/子类
- 纯 Perl
- 更容易调试(它是 Perl)
- 可以通过多种方式模拟 MakeMaker
- CPAN shell 将为您安装 Module::Build
模块::构建缺点:
- Module::Build 维护者(实际上是所有 Perl 工具链帮)讨厌它
- 旧版本的 CPAN 客户端(包括 CPANPLUS)对 Module::Build 一无所知。
模块::安装优点:
- 流畅的界面
- 捆绑本身,你有一个已知的版本
- 一切都知道如何处理 Makefile.PL
模块::安装缺点:
- 需要制作
- 一直使用捆绑版本,容易受到外部破坏
- 难以在其界面之外进行自定义
- 与 MakeMaker 的胆量混为一谈,因此新的 MakeMaker 版本最终将打破它。
- 不知道如何使用 v2 元规范生成 META 文件(新工具越来越有问题)
这里有两个问题。
首先,永远不要使用 h2xs。这是旧的过时的肮脏,虽然我想如果你真的想把头文件变成 XS 代码,它可能很有用(我自己从来没有做过)。
2011 年更新:我强烈建议您查看Dist::Zilla,特别是如果您认为您将维护多个模块。
要创建新模块,请使用 Module::Starter。它工作得很好,并且有一些很好的插件来自定义输出。
其次,你在问你应该使用什么构建系统。三个竞争者是 ExtUtils::MakeMaker (EUMM)、Module::Build (MB) 和 Module::Install (MI)。
EUMM 是一个可怕的讨厌的工作,但它确实有效,而且如果您根本不自定义构建过程,它就可以正常工作。
MB是新来的,它有它的批评者。最大的优点是,如果您想大量自定义安装和构建过程,使用 MB 完全有可能(并且以跨平台方式)完成此操作。使用 EUMM 真的是不可能的。
最后,MI 基本上是 EUMM 之上的声明性包装器。它还将自己与您的发行版打包在一起,试图解决用户尝试使用旧工具链模块安装模块的问题。“包自我”技巧的缺点是,如果 MI 本身存在错误,您必须重新发布所有模块才能修复它。
就定制而言,有一些 MI 插件,但如果你想超越它们,你将回到处理 Makefile 和跨十几个平台构建工具的问题,所以它真的无济于事你在那个领域太多了。
我刚刚将Distribution::Cooker上传到 CPAN。这是我用来制作新发行版的东西。它的好处是你的发行版可以是你喜欢的任何东西:你只是在做一些模板。我不在乎是否有人使用它。对我来说,它很简单,技术含量低,不会造成额外的问题。
您可以从Module::Starter之类的东西开始制作您的入门模板,然后添加您自己的样板和最喜欢的做事方式。您不仅可以选择每个文件中的任何内容,还可以选择发行版中显示的文件。当您弄清楚自己喜欢如何做事时,您只需更新自己的模板。
至于 Makemaker 和 Module::Build,未来是 Module::Build。现在只有我们这些老家伙在使用 Makemaker。:) 有办法同时使用两者(或假装同时使用两者)。查看 Module::Build、Module::Build::Compat 和 Module::Install 文档。Module::Build 被踢出 Perl 的标准库,它的未来是不确定的。它回到了 Makemaker 作为构建系统。
虽然这是一个逃避的答案,但尝试使用每个只是为了获得一些经验。
您可能还想查看Dist-Zilla,它是一个新的作者专用工具,用于创建发行版。因为它只是帮助构建发行版,它不附带您的代码或进行任何安装,它可以做很多强大的东西。
关于 Module::Build 兼容性的唯一问题是当用户尝试安装模块而不更新他们的 CPAN 客户端(CPAN.pm 或 CPANPLUS.pm) 如果他们从 CPAN 安装您的模块,他们可以轻松升级他们的客户端来自同一个镜子。
如果您不想在构建过程中做任何复杂的事情,请确保:使用 EUMM。但是,如果您在不同的目标平台上遇到构建问题,您可能最终会出现在 Makefile 中,这在每个 make 变体中都不同。
Module::Build 为您提供了许多功能(如果您扩展它,您可以想到任何东西)并且都是 perl,因此您永远不会最终调试 makefile。Module::Install 为您提供功能,但您必须捆绑它,最后一切都通过“make”运行。
两者都有优点和缺点。这些天来,我使用并推荐 Module::Build 和 Module::Starter。
我还推荐 Module::Build 和 Module::Starter (使用TT2 插件)。
Module::Build 无论如何都更好,但它的支持不如 ExtUtils::MakeMaker 广泛(更具体地说,旧版本的 Perl 不支持开箱即用)。这取决于您的需求。
就个人而言,我推荐 Module::Install,我认识的很多人也这样做 - Catalyst 和 Moose 之类的人也使用它。
以下是我希望回应采取的方向的一点说明:
- 各种框架的优缺点
- 框架的兼容性/安装基础
- 适用于内部(本地)与外部(CPAN)版本
- 不是裸露的“使用X”答案
戴夫的回答有一些很好的赞成/反对信息。Leon 的回答暗示了兼容性,但并不明确。正如brian d foy 所提到的,只有旧帽子使用 EUMM,但我不相信 MB 是用于 CPAN 的良好框架,因为它直到 5.9 才成为核心的一部分。
EU::MM 似乎仍然是最广泛支持和最受欢迎的一种,但 Module::Build 正在迎头赶上。此外,请查看Module::Starter以获取有助于您入门的模块。