编写模块的最佳框架是什么—— ExtUtils::MakeMaker (h2xs) 或 模块::构建?

有帮助吗?

解决方案

笔记 这个建议已经过时了。 Module::Build 已从 Perl 核心中删除 但作为 CPAN 模块继续存在。优点和缺点仍然存在,我对 MakeMaker 的看法仍然存在。


作为 ExtUtils::MakeMaker 的前维护者,我喜欢推荐 Module::Build,因为 MakeMaker 是一部恐怖片。Module::Build 放在一起要好得多。但这些不是你关心的问题,我将提出我的“对你来说最不麻烦”的答案。

执行摘要:

因为整个 Perl 中的 Module::Build 支持并不是 100% 到位,所以从 MakeMaker 开始。如果您想进行任何自定义,请切换到 Module::Build。由于它们的基本布局、选项和界面几乎相同,因此这将是轻松的。尽管它看起来很诱人,但请避免使用 Module::Install。

幸运的是,Module::Build 可以模拟 MakeMaker,这对某些人有帮助,但如果您要进行任何自定义,则没有帮助。看 模块::构建::兼容.

对于 CPAN 版本,使用 Module::Build 就可以了。现在 CPAN 上的 Module::Build 内容已经足够多了,每个人都已经开始处理它的引导问题了。

最后,新的 configure_requires 选项让 CPAN shell 知道在开始构建模块之前要安装 Module::Build。不幸的是,只有最新的 CPAN shell 知道configure_requires。

哦,无论你做什么都不要使用 h2xs(除非你正在编写 XS 代码......即使这样,也要考虑一下)。

MakeMaker 的优点:

  • 随附Perl并由Perl Core使用(因此它是积极维护的,并且将永远保持如此)
  • 所有人都知道如何使用 Makefile.PL。
  • 大多数模块创作文档都会涵盖 MakeMaker。
  • 用途(那些认识的人可以调试和修补构建过程)

MakeMaker 缺点:

  • 需要 make(想想 Windows)
  • 难以定制
  • 定制和跨平台变得更加困难
  • 当出现问题时很难调试(除非你了解 make)

模块::构建优点:

  • 更容易定制/子类化
  • 纯Perl
  • 更容易调试(它是 Perl)
  • 可以通过多种方式模拟 MakeMaker
  • CPAN shell 将为您安装 Module::Build

模块::构建缺点:

  • Module::Build 维护者(实际上是所有 Perl 工具链帮派)讨厌它
  • 旧版本的 CPAN 客户端(包括 CPANPLUS)不知道有关 Module::Build 的任何信息。

模块::安装 优点:

  • 流畅的界面
  • 捆绑包本身,你有一个已知的版本
  • 一切都知道如何处理 Makefile.PL

模块::安装缺点:

  • 需要制作
  • 始终使用捆绑版本,容易受到外部损坏
  • 很难在其界面之外进行定制
  • MakeMaker 的内部结构很糟糕,因此新的 MakeMaker 版本最终将打破它。
  • 不知道如何使用V2 META-SPEC生成元文件(越来越多的工具问题)

其他提示

这里有两个问题。

首先,永远不要使用 h2xs。这是过时的肮脏行为,但我想如果您实际上尝试将头文件转换为 XS 代码,它可能会很有用(我自己从未这样做过)。

2011年更新:我强烈建议看一下 地区::齐拉, ,特别是如果您认为您将维护多个模块。

要创建新模块,请使用 Module::Starter。它工作得很好,并且有一些很好的插件用于自定义输出。

其次,您询问应该使用什么构建系统。这三个竞争者是 ExtUtils::MakeMaker (EUMM)、Module::Build (MB) 和 Module::Install (MI)。

EUMM 是一项可怕的令人讨厌的工作,但它确实有效,而且如果您根本不自定义构建过程,它也可以正常工作。

MB 是新生事物,也有一些批评者。它的一大优点是,如果您想要大量自定义安装和构建过程,则很可能使用 MB 来明智地(并以跨平台方式)完成此操作。使用EUMM确实是不可能的。

最后,MI 基本上是 EUMM 之上的声明性包装器。它还将自身与您的发行版一起打包,以尝试解决用户尝试使用旧工具链模块安装模块的问题。“package self”技巧的缺点是,如果 MI 本身存在错误,您必须重新发布所有模块才能修复它。

就定制而言,有一些 MI 插件,但如果您想超越它们,您将回到处理 Makefile 并跨十几个平台构建工具的问题,所以它真的没有帮助你在那个领域太过分了。

我刚刚上传 分销::炊具 至 CPAN。这是我用来制作新发行版的东西。它的好处是您的发行版可以是您喜欢的任何发行版:你只是在制作一些模板。我不在乎是否有人使用它。对我来说,它很简单,技术含量低,并且不会造成额外的问题。

你可能会从类似的事情开始 模块::入门 制作您的入门模板,然后添加您自己的样板和最喜欢的做事方式。您不仅可以选择每个文件中想要的任何内容,还可以选择哪些文件显示在发行版中。当您弄清楚自己喜欢如何做事时,您只需更新自己的模板即可。

至于 Makemaker 和 Module::Build, 未来是 Module::Build. 。现在只有我们这些老家伙在用Makemaker了。:) 有多种方法可以同时使用两者(或假装使用两者)。 查看 Module::Build、M​​odule::Build::Compat 和 Module::Install 文档. 。Module::Build 被从 Perl 标准库中踢出,它的未来是不确定的。它又回到了 Makemaker 作为构建系统。

虽然这有点逃避的答案,但尝试使用每个只是为了获得一点经验。

您可能还想看看 齐拉区 这是一个新的仅供作者使用的创建发行版的工具。因为它只是帮助构建发行版,所以它不随您的代码一起提供或进行任何安装,它可以做很多强大的事情。

Module::Build 兼容性方面的唯一问题是,当用户尝试在不更新其 CPAN 客户端(CPAN.pm 或 CPANPLUS.pm)的情况下安装模块时,如果他们从 CPAN 安装您的模块,他们可以轻松升级其客户端来自同一个镜子。

如果你不想做 任何事物 当然,您的构建过程很复杂:使用EUMM。但是,如果您在不同的目标平台上遇到构建问题,则最终可能会出现在 Makefile 中,该文件在每个 make 变体中都是不同的。

Module::Build 为您提供了许多功能(如果您扩展它,您可以想到任何功能)并且都是 Perl,因此您永远不会最终调试 makefile。Module::Install 为您提供了功能,但您必须将其捆绑在一起,并且所有内容最终都通过“make”运行。

我还推荐 Module::Build 和 Module::Starter (带有 TT2 插件).

Module::Build 无论如何都更好,但它的支持不如 ExtUtils::MakeMaker 广泛(更具体地说,旧版本的 Perl 不立即支持它)。这取决于您的需求。

就我个人而言,我推荐 Module::Install,就像我认识的很多人一样 - Catalyst 和 Moose 等人也使用它。

以下是我希望回应采取的方向的一些澄清:

  • 各种框架的优缺点
  • 框架的兼容性/安装基础
  • 内部(本地)与外部的适用性外部 (CPAN) 版本
  • 不是 赤裸裸的“使用X”答案

戴夫的回答 有一些很好的赞成/反对信息。 莱昂的回答 暗示了兼容性,但并不明确。作为 布莱恩·D·福伊提到, ,只有旧帽子使用 EUMM,但我不相信 MB 是用于 CPAN 的良好框架,因为它直到 5.9 才成为核心的一部分。

两者都有优点和缺点。这些天我使用并推荐 Module::Build 和 Module::Starter。

EU::MM 似乎仍然是最广泛支持和流行的一种,但 Module::Build 正在迎头赶上。另外,请查看 模块::入门 一个可以帮助您入门的模块。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top