我应该用哪个框架来编写模块?

时间:2008-09-16 15:56:56

标签: perl perl-module

编写模块的最佳框架是什么 - ExtUtils::MakeMaker(h2xs)或Module::Build

11 个答案:

答案 0 :(得分:49)

注意此建议已过期。 Module::Build has been removed from the Perl core但作为CPAN模块继续存在。优点和缺点仍然存在,我对MakeMaker的看法仍然有效。


作为ExtUtils :: MakeMaker的前维护者,我想推荐Module :: Build,因为MakeMaker是一个恐怖秀。 Module :: Build组合得更好。但那些不是你的担忧,我会向你提出“最不麻烦”的答案。

执行摘要:

因为所有Perl都不是100%实现Module :: Build支持,所以从MakeMaker开始。如果要进行任何自定义,请切换到Module :: Build。由于它们的基本布局,选项和界面几乎完全相同,因此这将是无痛的。看起来很诱人,避免使用Module :: Install。

幸运的是,Module :: Build可以模拟MakeMaker,它可以帮助一些人,但如果您要进行任何自定义,则无法提供帮助。请参阅Module::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)

Module :: Build Pros:

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

Module :: Build Cons:

  • Module :: Build维护者(实际上所有的Perl Toolchain Gang)讨厌它
  • 较早版本的CPAN客户端(包括CPANPLUS)对Module :: Build一无所知。

Module :: Install Pros:

  • 光滑的界面
  • 捆绑自己,你有一个已知的版本
  • 一切都知道如何处理Makefile.PL

Module :: Install Cons:

  • 需要制作
  • 始终使用捆绑版本,易受外部破坏
  • 难以在界面外自定义
  • 与MakeMaker的胆量混淆,因此新的MakeMaker版本最终会破坏它。
  • 不知道如何使用v2元规范生成META文件 (越来越多的新工具出现问题)

答案 1 :(得分:35)

这里有两个问题。

首先,永远不要使用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并在十几个+平台上构建工具的问题,所以它真的不是在那个领域会帮助你太多。

答案 2 :(得分:20)

我刚刚将Distribution::Cooker上传到CPAN。这是我用来制作新发行版的内容。关于它的好处是你的发行版可以是你喜欢的任何东西:你只是在烹饪一些模板。我不在乎是否有人使用它。对我来说,这很简单,技术含量低,不会造成额外的问题。

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

对于Makemaker和Module :: Build,未来是Module :: Build 。只有我们老家伙再使用Makemaker了。 :)有两种方法可以同时使用(或假装使用两者)。 查看Module :: Build,Module :: Build :: Compat和Module :: Install docs 。 Module :: Build被Perl的标准库所取代,它的未来不确定。它回到Makemaker作为构建系统。

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

答案 3 :(得分:14)

您还可以查看Dist-Zilla这是一个新的仅作者工具来创建分发。因为它只是帮助构建发行版,它不附带您的代码或进行任何安装,它可以做很多强大的东西。

答案 4 :(得分:7)

与Module :: Build兼容的唯一问题是当用户尝试安装模块而不更新他们的CPAN客户端时(CPAN.pm或CPANPLUS.pm)如果他们从CPAN安装模块,他们可以很容易从同一个镜像升级他们的客户端。

如果您不想在构建过程中执行任何复杂的操作,请确保:使用EUMM。但是如果你在不同的目标平台上遇到构建问题,你可能最终会进入Makefile,这在make的每个变体上都是不同的。

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

答案 5 :(得分:2)

两者都有利弊。这些天我使用并推荐Module :: Build and Module :: Starter。

答案 6 :(得分:2)

我还推荐Module :: Build和Module :: Starter(使用TT2 plugin)。

答案 7 :(得分:2)

模块:: Build无论如何都更好,但它的支持程度低于ExtUtils :: MakeMaker(更具体地说,旧版本的Perl不支持开箱即用)。这取决于你的需求。

答案 8 :(得分:2)

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

答案 9 :(得分:2)

以下是我希望回应的方向的一点澄清:

  • 各种框架的利弊
  • 框架的兼容性/安装基础
  • 适用于内部(本地)与外部(CPAN)版本
  • 裸“使用X”答案

Dave's answer有一些很好的赞成/反馈信息。 Leon's answer暗示兼容性,但不明确。作为brian d foy mentioned,只有老帽子使用EUMM,但我不相信MB是一个很好的框架,用于CPAN的东西,因为它直到5.9才成为核心的一部分。

答案 10 :(得分:0)

EU :: MM似乎仍然是最受支持和最受欢迎的,但是Module :: Build正在迎头赶上。另外,请查看Module::Starter以获取可帮助您入门的模块。