11

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

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

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

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

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

7 回答 7

15

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

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

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

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

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

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

于 2009-07-31T17:20:29.640 回答
4

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

于 2009-07-31T17:26:40.067 回答
2

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

于 2015-02-11T06:24:48.947 回答
2

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

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

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

于 2009-07-31T17:11:56.787 回答
2

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

于 2009-07-31T17:15:33.317 回答
1

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

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

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

于 2009-08-01T08:49:13.280 回答
-1

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

BEGIN {
    use foo;
    use bar;

    die "Ghaaaa" if $foo::VERSION < 2.1;
    die "Aaaargh" if $foo::VERSION > 3.12;
}
于 2009-07-31T17:27:03.933 回答