编写模块的最佳框架是什么 - ExtUtils :: MakeMaker(h2xs)或Module :: Build?
注意此建议已过期. Module :: Build已从Perl核心中删除,但仍作为CPAN模块使用.优点和缺点仍然存在,我对MakeMaker的看法仍然有效.
作为ExtUtils :: MakeMaker的前维护者,我喜欢推荐Module :: Build,因为MakeMaker是一个恐怖秀.Module :: Build组合得更好.但那些不是你的担忧,我会向你提出"最不麻烦"的答案.
因为Module :: Build支持并非100%通过Perl实现,所以从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代码......甚至考虑一下).
附带Perl并由Perl核心使用(因此它被积极维护并将永远保持)
一切都知道如何处理Makefile.PL.
大多数模块创作文档将涵盖MakeMaker.
使用make(知道make的人可以调试和修补构建过程)
需要make(想想Windows)
很难定制
更难定制和制作跨平台
出现问题时很难调试(除非你了解make)
更容易定制/子类
纯Perl
更容易调试(它是Perl)
可以通过多种方式模拟MakeMaker
CPAN shell将为您安装Module :: Build
Module :: Build维护者(实际上所有Perl Toolchain Gang)都讨厌它
旧版本的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的插件,但是如果你想要超越它们,你将会回到处理Makefiles并在十几个+平台上构建工具的问题,所以它真的无济于事你在这个领域太多了.
我刚刚将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'运行.