如果我的 Perl 代码有生产代码位置和“测试版”代码位置
(例如,生产 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 版本必须调用其他 BETA 脚本和 BETA 库(如果存在)或生产库(如果 BETA 库不存在)
除了基本目录(
/usr/code/
vs/usr/code/beta/
)之外,测试版和生产版的代码路径必须相同>)脚本必须全部在同一基本目录下但它们可以在任意深度级别的子目录中(这排除了经典的
use lib "$FindBin: :Bin/../lib"
31.13 部分的解决方案。使用 "Programming Perl" 的 lib)
我将介绍我们如何解决这个问题作为对这个问题的回答,但我想知道是否有更好的方法。
最佳答案
我们自己的解决方案如下:
有一个库(我们称它为 BetaOrProd.pm)
- 库必须通过“
use BetaOrProd;
”包含在每个脚本 中
- 库必须是每个脚本中第一个
use
语句,在“use strict;
”pragma 之后(如果我们使用它的话,还有“use warnings”)。包括在任何BEGIN
block 之前。 - 库有一个包含大部分逻辑的
BEGIN
block - 库中的
BEGIN
block 检查程序的目录路径(基于 $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 库时,都不需要特殊的逻辑 - 由 BetaOrProd.pm 修改的
@INC
负责知道要从哪里导入模块.如果模块存在于 BETA 位置,则 BETA 脚本将使用 BETA 位置的库,否则使用 prod 位置的库。
这种方法的主要缺点是:
要求每个脚本必须将“
use BetaOrProd;
”作为每个脚本中“use strict;
"pragma.由于我们公司要求每个已部署的代码段都通过自动验证程序这一事实而有所缓和,自动验证程序可以检查此要求。
无法通过
/usr/code/beta/lib/perl
对 BetaOrProd.pm 进行 BETA 测试。嗯。通过非常彻底的单元和库集成测试缓解
关于perl - 我如何使用 beta Perl 脚本中的 beta Perl 模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2474588/