2009-07-31 74 views
10

我目前正在开发一个项目,使用另一个部门开发的框架作为基础。我们目前正在为我们的部门引入质量标准(最后,耶!),但目前不可能将这些质量标准引入其他部门。因此,我们正在努力克服一个持续不变的目标,而不是稳定的API或稳定的版本,这至少是压力。如何管理Perl模块依赖关系?

由于我们试图首先解决问题,所以我们希望尽可能保证自己能够抵挡“上游”a.k.a.框架代码中的更改。我们设想了硬件模块依赖关系:

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

这是迄今为止的计划。现在的问题:

  1. 明智吗?如果没有,还有其他想法?
  2. 如何在Perl中实现这个?使用use Module,我们只能定义应该使用的最低版本代码。

回答

2

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

一个答案:你可以下载模块并在测试环境中对它进行回归。

这里可以使用相同的吗?你是否必须指向他们模块的“实时”副本,还是可以指向你自己的副本?

+1

CPAN不稳定,因为你不能阻止任何人做任何事情。一个特定的模块可能完全没有bug,但即使是一个接口更改也可能会破坏依赖它的代码。罪魁祸首是CPAN工具链的设计,其中最新的版本是客户端试图安装的版本。 – 2009-07-31 17:27:07

2

我会通过制作我的代码所依赖的库的私有副本并将它们放在我的项目的lib目录中,了解到我将永远不会修改这些副本,除非定期签出新版本作为里程碑。

14

这是一个非常明智的计划,我通过一个叫做'DPAN'的类似CPAN的私有存储库来实现它。您可以从真正的CPAN(或BackPAN)中选择所需的分发版本和版本,并从中创建您自己的存储库。您的CPAN客户端仅指向此存储库,有效地将版本冻结到您想要的值。你只需要升级就可以了。

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

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

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

我的DPAN工作的下一个重要步骤是采用现有的Perl安装以及您可能已安装的任何模块,并创建可为您提供安装状态的存储库。我拥有所有需要完成这项工作的主要部分,但是我一直在忙着让几位客户在第一部分中运行。

如果您想了解更多关于这个东西的信息,请告诉我。 :)

+1

DPAN听起来不错。一旦我索引我的模块,我如何将我的CPAN客户端指向它? – jeje 2009-07-31 17:48:02

+1

如果您使用的是CPAN.pm,则可以将urllist设置修改为file:/// URL。这对于miniCPAN来说是一样的。我现在要去上班了,但如果遇到问题,请给我发电子邮件([email protected])。 – 2009-07-31 17:56:32

+0

我会尝试。谢谢! – jeje 2009-07-31 18:01:21

4

看看PAR。它可以让你将一组依赖关系打包成一个文件。您可以将它们发布的模块放入PAR文件中,只需要在接受其更改时升级PAR文件。

-1

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

BEGIN { 
    use foo; 
    use bar; 

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

有人已经指出PAR。我提到PAR::Repository和它的伙伴模块PAR::Repository::Client。他们实现了一个客户端/服务器基础架构,可以自动加载任何在本地找不到的依赖关系(或者甚至可以选择服务器的包)。作为管理员,您可以简单地向存储库添加或删除软件包。包的实际服务是用完全正常的服务器完成的:任何http(s)服务器或简单的file://都可以。其他协议应该是相当简单的实施。

它具有上述魔术自动加载机制,软件包安装和自动软件包升级。除了模块文档外,您还可以看看presentation on PAR from YAPC::Europe 2008,它涵盖了一些扩展。

我不得不承认,自动升级是足够先进的技术,可能会吃一个或两个婴儿,如果它全部运行的小猫啃。

1

那么我认为Carton是你正在寻找的东西(perl的打包机)。结合plenv我相信会做到这一点。