如何管理 Perl 模块依赖项?

Posted

技术标签:

【中文标题】如何管理 Perl 模块依赖项?【英文标题】:How can I manage Perl module dependencies? 【发布时间】:2010-11-15 20:10:15 【问题描述】:

我目前在一个项目中,该项目使用另一个部门开发的框架作为基础进行开发。我们目前正在我们部门引入质量标准(终于,耶!),但目前不可能将这些标准引入其他部门。因此,我们正在努力应对一个不断变化的目标,既没有 API 稳定性,也没有稳定版本,这至少是有压力的。

由于我们首先尝试在最终解决问题,因此我们希望保护自己免受“上游”又名框架代码中的更改的影响。我们设想了硬模块依赖:

    仅使用在代码中定义的框架模块的某些版本范围。 使用单元测试检查确保所有必要的版本仍然可用。 每个版本范围扩展都需要对框架代码进行同行评审。

这是目前为止的计划。现在的问题:

    合理吗?如果没有,还有其他想法吗? 如何在 perl 中实现这一点?使用use Module,我们只能定义应该使用的最低版本代码。

【问题讨论】:

【参考方案1】:

我认为Carton 是您正在寻找的东西(perl 的捆绑器)。结合plenv 我相信会成功的。

【讨论】:

【参考方案2】:

已经有人指出PAR。让我提一下PAR::Repository,它是配套模块PAR::Repository::Client。他们实现了一个客户端/服务器基础设施,可以自动加载本地找不到的任何依赖项(或者甚至可以更喜欢服务器的包)。作为管理员,您可以简单地在存储库中添加或删除包。包的实际服务是通过完全正常的服务器完成的:任何 http(s) 服务器或简单的 file:// 都可以。其他协议应该很容易实现。

它具有上述神奇的自动加载机制,包安装和包自动升级。除了模块文档,您还可以查看presentation on PAR from YAPC::Europe 2008,它在某种程度上涵盖了这一点。

我不得不承认,自动升级是足够先进的技术,如果没有足够的小猫来啃,可能会吃掉一两个婴儿。

【讨论】:

【参考方案3】:

这是一个非常明智的计划,我通过我一直称之为“DPAN”的类似 CPAN 的私有存储库来实施它。您可以从真实的 CPAN(或 BackPAN)中选择您想要的发行版和版本,并从中创建您自己的存储库。您的 CPAN 客户端仅指向此存储库,有效地将版本冻结为您想要的版本。您只在需要时升级。

此外,DPAN 不仅允许您轻松添加自己的本地私有代码,还可以修改第三方软件包以解决其安装问题等。我在 2009 年夏季刊中为这个想法提供了完整的理由The Perl Review。您还可以从我在 YAPC::Russia 的Creating Your Own CPAN 演讲中看到我的幻灯片。

如果您对这种解决方案感兴趣,请查看我的MyCPAN::App::DPAN 模块。它需要一个发行版目录并为您完成其余的工作。您将 CPAN 客户端指向它(并确保它不会连接到互联网),就是这样。

一旦您可以创建自己的存储库,您就可以轻松地创建一个测试存储库。将您认为要升级的版本转储到其中,在测试服务器上部署代码并收集结果。如果您不喜欢结果,可以轻松更改存储库。

我的 DPAN 工作的下一个重要步骤是安装现有的 Perl,包括您可能已安装的任何模块,并创建可为您提供该安装状态的存储库。我拥有完成这项工作所需的所有主要部分,但我有点忙于让几个客户开始使用。

如果您想了解更多关于这些内容的信息,请告诉我。 :)

【讨论】:

DPAN 听起来很棒。一旦我索引了我的模块,我如何将我的 CPAN 客户端指向它? 如果您使用的是 CPAN.pm,您可以将 urllist 设置修改为 file:/// URL。这与你为 miniCPAN 做的事情是一样的。我现在要上班了,但是如果您遇到问题,请给我发电子邮件 (brian.d.foy@gmail.com)。【参考方案4】:

如果你想检查外部模块的版本,你可以(如果至少他们正确地报告了他们的 $VERSION)使用这样的东西:

BEGIN 
    use foo;
    use bar;

    die "Ghaaaa" if $foo::VERSION < 2.1;
    die "Aaaargh" if $foo::VERSION > 3.12;

【讨论】:

实际上这行不通,因为您必须为每个模块都这样做。也许你可以限制 foo,但这并不能防止更新 foo 的依赖项。 相同:使用 foo 2.1; (最低限度)【参考方案5】:

看看PAR。它允许您将一组依赖项捆绑到一个文件中。您可以获取他们发布的模块,将它们放入 PAR 文件中,并且仅在您想要接受他们的更改时才升级 PAR 文件。

【讨论】:

这确实存在可移植性问题。 PAR 在编译代码和动态库方面存在问题。在这种情况下,这可能无关紧要,但它对 m 客户中的一些人来说很重要。 你为什么不把这些东西报告为错误?你不是不知道怎么联系我。此外,编译代码有什么问题?据我所知,这仅仅意味着您必须为每个目标平台创建一个 .par:毕竟它是一种二进制格式。原则上,它应该可以处理共享库。【参考方案6】:

我会通过制作我的代码所依赖的库的私有副本并将它们放在我的项目的 lib 目录中来解决这个问题,我知道我永远不会修改这些副本,除非在达到里程碑时定期检查新版本.

【讨论】:

【参考方案7】:

虽然我希望 CPAN 比您所依赖的模块更稳定,但让我问一个类似的问题:您将如何保护自己免受 CPAN 模块中的意外更改?

一个答案:您会下载该模块并在测试环境中针对它回归您的代码。

这里也可以用吗?您必须指向他们模块的“实时”副本,还是可以指向您自己的副本?

【讨论】:

CPAN 不稳定,因为您无法阻止任何人做任何事情。一个特定的模块可能完全没有错误,但即使是接口更改也会破坏依赖它的代码。罪魁祸首是 CPAN 工具链的设计,其中最新版本是客户尝试安装的版本。

以上是关于如何管理 Perl 模块依赖项?的主要内容,如果未能解决你的问题,请参考以下文章

卸载 cpan 安装的所有 perl 模块

如何通过 NPM 管理非节点模块作为 Node Project 的依赖项?

用于仅测试依赖项的 Gradle 变体感知依赖项管理

如何管理 Gradle 模块之间的依赖关系?

使用 Dagger 2 管理大型多库模块项目中的依赖项

GO语言(二十五):管理依赖项(上)-