关于perl:我应该使用哪个框架编写模块?

关于perl:我应该使用哪个框架编写模块?

Which framework should I use to write modules?

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


注意此建议已过时。 Module :: Build已从Perl核心中删除,但仍作为CPAN模块存在。优点和缺点仍然存在,而我对MakeMaker的看法仍然存在。

作为ExtUtils :: MakeMaker的前维护者,我喜欢推荐Module :: Build,因为MakeMaker令人震惊。 Module :: Build更好地组合在一起。但这不是您关心的问题,我将提出"给您带来的最小麻烦"的答案。

执行摘要:

因为在所有Perl中,Module :: Build的支持都不是100%,所以从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)

模块::构建优点:

  • 易于定制/子类化
  • 纯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之上的声明性包装器。它还与发行版一起打包,以解决用户尝试使用旧工具链模块安装模块的问题。" package self"技巧的缺点是,如果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'运行。


以下是我希望回复的方向的一些说明:

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

戴夫的答案有一些不错的专业知识。莱昂的答案暗示了兼容性,但并不明确。正如brian d foy所提到的,只有旧版本才使用EUMM,但是我不相信MB是用于CPAN的良好框架,因为它直到5.9才成为核心。


我个人建议使用Module :: Install,就像我认识的许多人一样-Catalyst和Moose的人也使用它。


Module :: Build在任何方面都比较好,但是与ExtUtils :: MakeMaker相比,它的支持范围不广(更具体地说,Perl的较早版本不开箱即用)。这取决于您的需求。


我还建议使用Module :: Build和Module :: Starter(带有TT2插件)。


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


EU :: MM似乎仍然是得到最广泛支持和最受欢迎的工具,但是Module :: Build正在赶上。另外,请查看Module :: Starter中可帮助您入门的模块。


推荐阅读

    linux命令在哪编写?

    linux命令在哪编写?,系统,工具,管理,单位,软件,权威,项目,代码,位置,产品,学

    linux系统删除的命令?

    linux系统删除的命令?,软件,系统,名称,工具,不了,命令,文件夹,电脑,通用,信

    linux完成编写命令?

    linux完成编写命令?,系统,工作,命令,管理,状态,信息,数据,工具,单位,基础,lin

    linux编写文本命令?

    linux编写文本命令?,工作,系统,命令,第一,信息,发行,代码,名字,文件,终端,lin

    linux删除命令文件夹?

    linux删除命令文件夹?,系统,数据,通用,文件夹,命令,文件,环境,百度,不了,名

    linux删除本行命令?

    linux删除本行命令?,系统,本行,档案,命令,资料,商业,文件,终端,目录,文件名,L

    linux删除第一行命令?

    linux删除第一行命令?,单位,系统,命令,标的,不了,数字,连续,名称,档案,文件,m

    linux删除本行命令?

    linux删除本行命令?,系统,本行,档案,命令,资料,商业,文件,终端,目录,文件名,L

    linux删除命令文件夹?

    linux删除命令文件夹?,系统,数据,通用,文件夹,命令,文件,环境,百度,不了,名

    linux删除第一行命令?

    linux删除第一行命令?,单位,系统,命令,标的,不了,数字,连续,名称,档案,文件,m

    linux里删除区间命令?

    linux里删除区间命令?,系统,命令,情况,档案,不了,名称,目录,文件,文件夹,分

    linux命令安条件删除?

    linux命令安条件删除?,系统,命令,不了,通用,名称,文件夹,文件,目录,软件,子

    linux命令退出编写?

    linux命令退出编写?,档案,状态,命令,电脑,工具,分析,系统,实时,编辑,模式,lin

    linux文件夹删除命令?

    linux文件夹删除命令?,系统,命令,不了,档案,名称,通用,文件夹,文件,目录,指

    删除命令linux命令?

    删除命令linux命令?,系统,不了,档案,名称,命令,文件夹,文件,环境,数据,目录,l

    linux删除最近命令?

    linux删除最近命令?,档案,名称,不了,命令,文件,系统,目录,文件夹,指令,参数,l

    删除小文件linux命令?

    删除小文件linux命令?,系统,工作,地址,信息,命令,通用,目录,文件,文件夹,功

    linux快速删除命令行?

    linux快速删除命令行?,系统,软件,名称,数据,命令,文件,档案,不了,电脑,通用,l

    删除linux文件命令?

    删除linux文件命令?,名称,不了,文件夹,命令,文件,目录,方法,指令,子目录,选

    linux下删除用户命令?

    linux下删除用户命令?,系统,代码,邮箱,用户组,命令,用户,名称,管理,电脑,账