我们有一个设置,其中大多数代码在升级到全面生产之前以 BETA 模式部署 - 这意味着它在完整的生产环境中运行(使用生产数据库 - 通常是生产数据;和生产 Web 服务器)。我们称该阶段为 BETA 测试。
主要要求之一是 BETA 代码升级到生产必须是从 beta 到生产目录的简单“cp”命令 - 没有代码/文件名更改。
对于非 Web Perl 代码,实现无缝 BETA 测试是完全可行的(详见此处):
- Perl 程序位于生产根目录 (
/usr/code/scripts
) 下的标准位置,生产 perl 模块位于同一根目录 (/usr/code/lib/perl
) - BETA 代码具有 100% 相同的代码路径,除了 beta 根 (
/usr/code/beta/
) - 一个特殊的模块
@INC
根据脚本是从/usr/code/scripts
或调用来操作任何脚本/usr/code/test/scripts
,以包含用于 beta 脚本的 beta 库。
在我们需要对我们的 Web Perl 代码进行 beta 测试之前,此设置工作正常(设置是 EmbPerl 和 Apache/mod_perl)。
问题如下:如果生产 Perl 模块和 BETA Perl 模块具有相同的名称(例如/usr/code/lib/perl/MyLib1.pm
和/usr/code/beta/lib/perl/MyLib1.pm
),那么 mod_perl 将只能将其中一个模块加载到内存中- 我们无法意识到由于并发问题,特定网页会影响当前加载的模块版本。
抛开明显的非编程解决方案(获得一个血腥的 BETA web 服务器),出于政治/组织原因是不可行的,有什么方法可以在 Perl 或 mod_perl 中以某种方式解决这个问题?
我尝试了各种方法来卸载%INC
已列出的 Perl 模块,但问题仍然是另一个用户可能会在正确(或相当错误)的时刻加载 beta 页面并加载 beta 模块,该模块将用于我的生产页面.