首页 / 知识

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

2023-04-16 00:38:00

关于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中可帮助您入门的模块。


模块框架删除核心

最新内容

相关内容

猜你喜欢