如何使用beta Perl脚本中的beta Perl模块?

DVK*_*DVK 5 testing perl perl-module

如果我的Perl代码有一个生产代码位置和"beta"代码位置(例如生产Perl代码我们/usr/code/scripts,BETA Perl代码在/usr/code/beta/scripts;生产Perl库,/usr/code/lib/perl并且这些库的BETA版本都在/usr/code/beta/lib/perl,对我来说是否有一个简单的方法实现这样的设置?

具体要求是:

  • 代码必须是生产和BETA位置的相同.

    为了澄清,为了将任何代码(库或脚本)从BETA推广到生产,需要发生的唯一事情就是cp从BETA向prod位置发出命令 - 文件名和文件内容必须保持相同.

  • BETA版本的脚本必须调用其他BETA脚本和BETA库(如果存在)或生产库(如果BETA库不存在)

  • BETA和生产之间的代码路径必须相同,但基目录(/usr/code/vs /usr/code/beta/)除外

  • 这些脚本必须全部相同的基本目录下,但他们可能会在其子目录中的任意深度的水平(这排除了经典use lib "$FindBin::Bin/../lib"的部分解决方案31.13.使用LIB"的Perl编程")

我将介绍我们如何解决问题作为这个问题的答案,但我想知道是否有更好的方法.

DVK*_*DVK 3

我们自己的解决方案如下:

  • 拥有一个库(我们称之为 BetaOrProd.pm)

    • 该库必须通过每个脚本use BetaOrProd;中的“”包含
    • use该库必须是每个脚本中“” pragma 之后的第一个语句use strict;(如果我们使用它,则为“use warnings”)。包括在任何BEGIN块之前。
    • 该库有一个BEGIN包含大部分逻辑的块
    • 库中的该BEGIN块检查程序的目录路径(基于 $0 并应用绝对路径)
    • 如果目录路径以 开头/usr/code/beta,则程序被视为在 BETA 位置运行,否则在生产环境中运行
    • 在任何一种情况下,/usr/local/lib/perl都不会移动到@INC列表的开头
    • 如果是 BETA 位置,则此后/usr/code/beta/lib/perl不会移动到列表的开头。@INC
    • 如果是 BETA 位置,则特殊变量 $isBETA(可通过从 BetaOrProd.pm 导出的访问器方法访问)设置为“BETA”。
  • 每当脚本/库需要调用另一个脚本时,被调用脚本的路径都会根据从 BetaOrProd.pm 导出的 $isBETA 变量的所述访问器来计算

  • 任何时候需要或使用 Perl 库时,都不需要特殊的逻辑 - @INCBetaOrProd.pm 的修改负责了解从哪里导入模块。如果模块存在于 BETA 位置,则 BETA 脚本将使用 BETA 位置的库,否则使用 prod 位置的库。

这种方法的主要缺点是:

  1. 要求每个脚本必须将“ ”作为每个脚本中“”编译指示之后的use BetaOrProd;第一个语句。useuse strict;

    我们公司要求每一段已部署的代码都通过自动验证器,该验证器可以检查此要求,这一事实缓解了这一问题。

  2. 无法通过 BETA 测试 BetaOrProd.pm /usr/code/beta/lib/perl。呃。

    通过对库进行非常彻底的单元和集成测试来缓解