编写模块的最佳框架是什么 - ExtUtils::MakeMaker(h2xs)或Module::Build?
答案 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代码......甚至要考虑它)。
答案 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)
以下是我希望回应的方向的一点澄清:
Dave's answer有一些很好的赞成/反馈信息。 Leon's answer暗示兼容性,但不明确。作为brian d foy mentioned,只有老帽子使用EUMM,但我不相信MB是一个很好的框架,用于CPAN的东西,因为它直到5.9才成为核心的一部分。
答案 10 :(得分:0)
EU :: MM似乎仍然是最受支持和最受欢迎的,但是Module :: Build正在迎头赶上。另外,请查看Module::Starter以获取可帮助您入门的模块。