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

===============>>#1 票数:49 已采纳

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


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

执行摘要:

因为在Perl的所有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-spec生成META文件(使用更新的工具会越来越多地出现问题)

===============>>#2 票数:35

这里有两个问题。

首先,切勿使用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和跨十几个平台构建工具的问题,因此它确实无济于事在那个领域你太多了。

===============>>#3 票数:20

我刚刚将Distribution :: Cooker上传到CPAN。 这就是我用来制作新发行版的方式。 这样做的好处是您的发行版可以随心所欲:您只是在烹饪一些模板。 我不在乎是否有人使用它。 对我来说,这是简单的,技术含量低的程序,不会引起额外的问题。

您可以从Module :: Starter之类的东西开始,制作您的入门模板,然后添加自己的样板和最喜欢的做事方式。 您不仅可以选择每个文件中想要的内容,还可以选择哪个文件显示在发行版中。 在确定自己喜欢做的​​事情时,您只需更新自己的模板。

至于Makemaker和Module :: Build, 未来将是Module :: Build 只是我们使用Makemaker的老家伙了。 :)有几种同时使用(或假装同时使用)的方法。 查看Module :: Build,Module :: Build :: Compat和Module :: Install docs Module :: Build已从Perl的标准库中剔除,并且前途未卜。 它作为构建系统返回到Makemaker。

尽管这是一个解决之道,但请尝试使用每种方法以获得一点经验。

===============>>#4 票数:14

您可能还想看看Dist-Zilla ,这是一个仅创建作者的新工具,用于创建发行版。 因为它仅有助于构建发行版,所以它不随您的代码一起提供或进行任何安装,因此可以执行许多强大的工作。

===============>>#5 票数:7

与Module :: Build兼容的唯一麻烦是,当用户尝试安装模块而不更新其CPAN客户端(CPAN.pm或CPANPLUS.pm)时,如果他们是从CPAN安装模块,则可以轻松升级其客户端从同一面镜子。

如果您不想在构建过程中做任何复杂的事情 ,请确保:使用EUMM。 但是,如果您在其他目标平台上存在构建问题,则可能会最终进入Makefile,这在每个make版本中都不同。

Module :: Build为您提供了许多功能(如果您对其进行扩展,可以想到的一切),并且都是perl的,因此您永远不会最终调试makefile。 Module :: Install为您提供功能,但是您必须将其捆绑在一起,然后最终所有内容都会通过“ make”运行。

===============>>#6 票数:2

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

===============>>#7 票数:2

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

===============>>#8 票数:2

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

===============>>#9 票数:2

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

===============>>#10 票数:2

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

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

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

===============>>#11 票数:0

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

  ask by Michael Carman translate from so

未解决问题?本站智能推荐:

1回复

如何使用你编写的perl模块?

我刚刚编写了我的第一个Perl模块,并且无法使用我生成的脚本。 以下是我尝试运行使用新创建的模块的脚本时Perl解释器显示的错误。 错误信息: scraper_tools_v1.pm是我编写的Perl模块,getYid.pl是试图利用scraper_tools_v1.pm模块的P
3回复

处理相互使用的模块的最佳方法是什么? [关闭]

处理相互使用的模块的最佳方法是什么? 假设我有一个具有哈希函数的模块: 另一个模块已经分段列出: 假设足够的这些实用程序函数足够方便我将在BEGIN语句中使用它们并导入函数来处理参数列表或配置数据。 我一直在将子定义放入BEGIN块中,以确保只要有人包含模块就可以使用
1回复

在Perl中使用多个包来使用JSON :: RPC :: Server编写API服务器模块

我已经编写了一个使用JSON :: RPC :: Server的服务器模块,并试图导入多个包(使用use )。 这是Server.pl文件的代码: 这很好。 但是,我想导入( use )另一个文件,比如说减法。 我试过以2种方式重写服务器模块,如下所示: 和 当我尝
4回复

我应该如何组织许多Perl模块?

考虑到我在12个目录中有100个Perl模块。 但是,查看主要的Perl脚本,它看起来像100 use p1 ; use p2 ; use p1 ; use p2 ; 等解决这个问题的最佳方法是什么?
2回复

我应该从自己的perl模块中读取ARGV

我的Perl从(多个)日志文件中提取和处理数据,当前正在处理@ARGV所有文件。 这个脚本最重要的部分是日志解码本身,它结合了很多关于日志文件格式的知识。 这个转换部分来自log(实际上是一个散列数组)已被证明是变化的主题 (随着日志格式的发展),并成为进一步处理步骤的基础 :从解码记录
1回复

我应该如何处理Perl模块内部或外部的错误?

我开始学习如何使用perltoot在perl中制作模块: 我想知道如何在可能的情况下通过示例代码威胁模块内部及其外部的任何错误? 例如: 要么 如果我在模块中调用了其他任何有错误,有问题,缺少参数的方法,那么如何正确地判断出有错误呢? PS:希望我
1回复

我应该在哪里放置两个Perl模块共有的代码?

我正在创建几个Perl模块,它们将使用常用实用程序来打开和关闭文件。 例如, mod1.pm mod2.pm 现在,我应该在哪里放置openf以便代码不重复?
4回复

在Perl中使用模块

我正在尝试为示波器创建一个函数库,但似乎无法让其他模块文件正常播放。 除了Oscope.pm文件之外,这里还有什么。 如果需要,我也可以上传。 test.pl Oscope / Acquire.pm 输出量 无法通过C:\\ Documents and S
2回复

如何命名perl模块,SomeModule与Some :: Module [关闭]

perl模块是否有任何首选的命名约定? 例如,在perl世界中更常见的做法是SomeModule或Some::Module ? 也许在某些情况下,一种风格比另一种风格更好?
2回复

我什么时候应该使用`use`?

只要我记得,每当我使用模块时,在代码的开头都会包含一条use行。 最近,我正在编写两个相互使用的Moose对象模块。 看一下这个过于简单的例子: 一个模块: 另一个模块:包装M2 0.001; 还有一个使用它们的简短示例: 现在,请注意两个模块相互使用。