23

ETA:当我问“你为什么不使用 CPAN 模块?”时,我指的是那些拒绝使用任何CPAN 模块(包括像DBI这样的高质量模块)的人。并非所有的 CPAN 代码都是高质量的,远离琐碎或基于实验代码的模块是可以的(前几天我对一个开发人员很生气,因为他想要引入Time::Format只是因为他没有'不知道 strftime 在POSIX中)。

最近在Perl Beginners上,有人想知道如何在不借助通常为该功能建议的 Perl 模块的情况下做某事。他或她不想从 CPAN 安装模块。这让我想到了我看到人们避免使用 CPAN 的原因,我想出了这种行为的五个原因以及每个原因的解决方案:

  1. 他们吓到你(回答,克服它)
  2. 他们吓到你的系统管理员(回答,通过在你的主目录中安装并使用 lib pragma 来解决它们)
  3. 您正在使用阻止您安装模块的托管服务(回答,获得更好的服务,有些便宜的服务不像白痴)
  4. 目标机器不一定有所需的模块(回答,使用 PAR 或 PAR::Packer)
  5. 目标机器完全被锁定(即您登录到 rbash 并且必须向第三方提供代码以包含在盒子上)(4 的组合并通过官僚机构)
  6. 您正在使用无法加载模块的 Perl 嵌入式版本(没有答案,您被卡住了,但这非常罕见)

那么,如果您不使用 CPAN,为什么以及为什么上面的答案不够充分?请注意,我不是在问您为什么不直接从 CPAN 在生产 boxen 上安装,而是在问您为什么避免使用 CPAN 中的模块(通过打包系统安装对我来说算作使用 CPAN)。

4

11 回答 11

16

我有时建议人们不要使用某些 CPAN 模块有几个原因。并非所有 CPAN 都是高质量的代码,并且针对不同的发行版有不同的维护级别。每个人都应该考虑他们必须做多少工作才能使用特定的 CPAN 模块以及该模块为他们节省了什么(即总拥有成本)。使用任何特定的 CPAN 模块并不总是有益的。我并不是说人们不应该使用任何 CPAN,但他们应该考虑他们真正需要什么。

  1. 外部模块依赖项允许其他人破坏您的应用程序。CPAN 工具链只关心模块的最新版本,当它看到你有一个早期版本时可能会升级你的安装。当底层的外部依赖项引入新的错误、不推荐使用的功能等时,我已经看到许多应用程序崩溃。这是我一直在为公司开发我的工具来托管他们自己的 CPAN 存储库以便他们可以控制它的原因之一。还有其他方法可以缓解这种情况,但没有多少人足够成熟,可以有一个好的流程。

  2. 您在必须批准所有代码的环境中工作。对很多人来说,这似乎是一个愚蠢的要求,但风险​​管理人员也有工作要做。有时,这种合规性是由各种法律、护理标准等规定的。除非该模块真的可以节省大量时间和精力,否则可能不值得为完成该过程而付出努力。真的,你们中有多少人认真检查过从 CPAN 获得的代码?里面可能有任何东西。

  3. 一些 CPAN 模块实现了简单编码的功能。仅仅因为它在 CPAN 上而使用一个模块并且您不想自己编写这三行代码有点愚蠢。你可以随心所欲地谈论代码重用,但归根结底,那就是reductio ad absurdum

  4. 某些模块的安装可能非常棘手、脆弱和不可预测,有时这是由于构建和测试模块的依赖项列表很长,即使您不需要这些依赖项来实际使用该模块。在自动化测试环境中处理这些情况需要做很多工作。

  5. 一些 CPAN 作者是实验性编码人员,而不是维护人员。在他们的工作上创建依赖关系意味着您最终会得到一个不受支持的模块,该模块没有得到修补,也没有其他人真正关心过。对于一些重要的项目来说,让你的补丁被接受是一件非常重要的事情,如果不求助于一些使用本地补丁版本的过程并且不会被 CPAN 工具链覆盖,你就无法修复无响应的作者。

对于使用其他服务、在本地目录中安装等的 glib 答案,您不会逃避这些原因。您不能将反论点应用于每种情况和设置。任何告诉您其他情况的人,例如Leon 链接到的不使用模块的七大(坏)理由中的顶部帖子,并没有真正考虑任何人的情况,并且有许多深思熟虑的反反论点。

永远不要从认为任何人应该或不应该使用 CPAN 的立场开始。评估当地情况,评估风险和回报,制定风险保障措施,明智地使用模块。这与任何其他类型的严肃软件开发或商业实践没有什么不同。

于 2009-03-25T09:30:00.953 回答
8

您可能会发现这篇文章(及其评论)很有趣。

于 2009-03-24T18:02:43.837 回答
8

我很高兴你问。

我想问一个问题,比如“为什么 CPAN 必须这么烂?” 但是当我(认为我)已经知道答案时,我决定牺牲我的声誉是不值得的。由于这个问题被标记为“主观”,我会感谢你没有缓和我对这个问题的个人看法,即使你认为我是错误的或愚蠢的。

首先是一些背景知识:我在 90 年代中期编写了很多 Perl 编码并且很喜欢它,但最终得出结论,该语言缺少许多“真正的”面向对象编程所需的特性。我成为 C++ 开发人员已有好几年了,现在是一名技术含量很高的项目经理。我仍然使用 Perl 进行脚本和数据处理以及其他零碎的工作,并且最近开始使用 Perl 脚本来测试我们的编码人员开发的 Web 服务。

无论如何,我来到堆栈溢出是为了项目管理,但为了 Perl 而留了下来。我很高兴看到这门语言已经成长起来,并且拥有各种很棒的模块,比如 Moose 和 MVC 以及模板等等,并且很想使用它们……我会的。但这需要时间,而且我现在只有几个小时来处理它。为什么不容易?

但是要回答这个问题...

  1. 首先是显而易见的答案:大多数 Perl 程序不需要 CPAN 模块。

  2. 有不止一种方法可以做到这一点。我不需要模块来做很多我会使用模块的事情,如果这样做很容易的话。例如,我一直在用 split() 和正则表达式解析 XML 文档。我知道这是错误的(但恢复的第一步是承认你有问题)。但是我可以在几秒钟内复制并粘贴代码来完成这项工作,或者我可以离开并尝试让 cpan 再工作一个月左右。

  3. 现在让我们有一点争议。CPAN 很脆弱。今年早些时候,我尝试使用 cpan 安装 Moose,因为我阅读了关于它的精彩内容,并且热衷于在 Perl 中进行正确的 OO 编程,并且它不难/难看。所以我按照安装说明,按了数百次(看起来)“Y”,然后在最后一步被编译器警告的页面和页面倾倒。我现在该怎么办?我的主开发盒有某种半损坏的 Moose 模块,正等着(我敢肯定)在我最不期待的时候咬我的屁股。那是大约两个月前的事了,我还没有回来。我推测很多 Perl/CPAN 都依赖于其他编程语言,这使得它更加脆弱(与库以相同语言编码的语言相反)。

  4. CPAN 初学者的文档很差。无论如何,权威的 CPAN 文档在哪里?初学者的介绍和教程在哪里?我怎么会知道呢?我已经断断续续地阅读了几个月的 CPAN 文档,并且开始弄清楚事情在哪里。(我看到几乎所有 CPAN 上的单个 Perl 模块在内部都有精美的文档,但我花了很长时间才找到该文档。)

  5. 安装过程太难了。十年前,包少、依赖少的时候,四步百提示可能还行,但现在就很烂了。为什么我不能在我的 shell 中输入“cpan-install Moose”之类的内容并完成它?这特别奇怪,因为高级用户经常声称可移植性是一种美德,引用了我仍然没有得到的包和 PAR 之类的东西。既然有这么多人似乎想要在本地安装,为什么还要更难呢?

  6. 有一些令人烦恼的问题,例如我应该使用 cpan 还是使用包管理系统安装 CPAN 模块,其中建议不一致。更一般地说:有不止一种方法可以做到这一点。当你开始学习高级 Perl 时,你必须决定如何安装模块、使用哪些模块以及从哪里开始?请记住,您是初学者,文档有点零散,学习曲线陡峭。我的解决方案是在我阅读更多内容时尝试通过不使用 cpan 来解决这个问题。

  7. 最后,高级 Perl 的学习曲线非常陡峭。高级 Perl 用户显然不记得这一点,也看不到它。IMO 在使用 Perl 最初的构想(作为具有强大正则表达式的实用提取和报告语言)与将其用作具有 OO、模板和 MVC 以及各种其他好东西的现代开发平台之间存在天壤之别. 我还没有找到一条从普通 Perl 使用到高级 Perl 使用的温和、渐进的路径。

所以你去。为咆哮道歉。

于 2009-03-25T17:44:23.357 回答
6

在本地安装 Perl 模块有点挑战。这是我的过程:

设置用户本地化的 CPAN 配置:

mkdir -p ~/.cpan/CPAN
touch ~/.cpan/CPAN/MyConfig.pm

如果 CPAN 之前是为站点范围的管理员设置的(也就是说,您在自己的机器上并且已经启动并配置了 CPAN),您可以通过以下方式更改为用户本地:“ perl -MCPAN -e mkmyconfig”。然后,编辑“ ~/.cpan/CPAN/MyConfig.pm”:

'makepl_arg' => q[LIB=/home/your_name/perllib],

否则,您可以正常启动 CPAN:“ perl -MCPAN -e shell”或简单地“ cpan”。系统将提示您进行配置。在“'perl Makefile.PL' 命令的参数?”处,输入:“ PREFIX=~ LIB=~/lib/perl5”。

要在您的 Perl 脚本中引用本地安装的模块,您可以执行use libpragma,但我认为当您的应用程序中有大量 perl 脚本和模块要更新时,这是一个烦人的依赖项。这更像是一种解决方法。

相反,我可以将环境变量设置PERL5LIB为本地安装模块的路径,例如“ $HOME/lib/perl5”。要设置PERL5LIBCGI 环境,请弄清楚如何在服务器配置中设置环境变量。在 Apache 中,我可以在httpd.conf.htaccess使用 mod_env 中做到这一点。(谢谢,布赖恩·d·福伊)

于 2009-03-24T18:20:23.620 回答
6

您可能将 Perl 脚本引擎嵌入到主机应用程序(例如 Web 服务器或任何需要脚本的复杂应用程序)中,并且在该嵌入式上下文中有很多限制,例如无法加载文件。

于 2009-03-24T18:37:01.430 回答
5

如果事情“吓坏了系统管理员”,他们不希望你把它们放在机器上,不管你认为你会把它们放在哪里。商店有标准是有原因的。

CPAN 模块没有责任分配。在我目前工作的商店中,我们与封装的会计软件提供商达成了这样的协议。如果我们的应用程序出现故障并且我们需要他们的专业知识,我们会在半夜给他们打电话。因为如果我们的计算搞砸了,我们与他们的合同确保他们将支付部分账单,这取决于他们对给定问题的暴露程度。

当您进入现实世界时,Perl 脚本可以与 40 岁的成熟、顽固的 COBOL 一起运行,您可能会明白管理人员运行 COBOL 比使用“脚本”更轻松,这很大程度上取决于热心爱好者,无论多么聪明。

也就是说,我目前的商店对非关键脚本和报告的 Perl 有点满意,并且会偶尔安装 CPAN 模块,但审批过程很严格,沙盒测试很长(而且很昂贵!),但它使之成为可能。我只能想象他们可以批准一两个新模块,而不是 50 多个新模块,因为这会使他们面临多少新情况。因此,如果任何依赖项显示“不推荐用于生产代码”或“实验性”,那么由“让我们只使用 CPAN”人群创建的模块几乎都被淘汰了。

于 2009-03-24T22:15:07.037 回答
4

这是我能想到的一个正当理由:您想弄清楚如何自己做。这很好,只要您意识到生产环境不适合您自己的个人实验。

有人可能会说“看看 CPAN 模块是如何做到的”,但阅读别人的实现并不能代替自己做。老实说,很多 CPAN 实现有点可怕。这可能是对 CPAN 代码质量的贬低,但它也是一个成功案例,说明 CPAN 模块的封装和测试程度在很大程度上是您没有注意到的。

至于所有关于“CPAN shell 很难设置”的变体答案,我同意。但是,这是一个 O(1) 问题。你解决它一次,然后你就可以在你的余生中轻松访问 CPAN。

于 2009-03-25T19:46:10.270 回答
4

一些模块基于开源库,在您拥有的所有疯狂环境中都无法编译或运行良好。例如考虑需要在 NCR、HP、SUN、Linux 和 AIX 上运行。

于 2009-04-20T04:11:26.323 回答
3

目标机器不一定有需要的模块

这在某些环境中可能是有效的。我的一个朋友在一个跨越国家和大陆的大型企业集团工作。他经常使用 perl 让磁带驱动器在世界各地做事。脚本必须部署在数以千计的机器上,并且安装模块非常重要——通常在每个物理位置都涉及一个委员会和多个系统管理员。他倾向于不惜一切代价避免他们,我不能说我责怪他。

有解决方案吗?我真的不认为有。

(以上是我对关于 permonks 的一个非常相似的问题的回答的剪切和粘贴。)

http://perlmonks.org/?node_id=750387

(回答,使用 PAR 或 PAR::Packer)

我曾经向他建议过 PAR,但根本不实用。没有一台机器足够相似,以至于 PAR 在一般情况下真正有用。他的选择是:不使用模块或维护 1300 个 PAR 二进制文件。即使您肯定知道目标模式,PAR 也很难很好地工作,因此他选择不使用模块。

于 2009-03-25T11:09:49.030 回答
2

目标主机有一个笨拙的操作系统,CPAN 模块不能很好地支持(部分原因是缺乏CPAN 测试器)。

此类示例是 AIX 和 HP-UX。他们有一个旧的 perl,要么没有 C 编译器,要么有一个旧的/损坏的库和旧的/损坏的库,所以太多的 XS 模块无法开箱即用地安装。修补它们需要时间(尤其是当 CPAN 作者几个月都没有回复时),并且在实践中尝试解决 XS 模块是不可能的(好吧,如果你真的想这样做,你将不得不经常修补纯 perl 模块依赖于 XS 模块)。

于 2012-09-04T15:49:33.813 回答
1

这是积极方法的答案,即它说明了如何解决使您无法使用 CPAN 模块的限制:是的,即使您可以使用 CPAN

于 2013-09-16T13:22:27.370 回答