【发布时间】:2010-03-19 11:26:22
【问题描述】:
我们有一个设置,其中大多数代码在升级到全面生产之前以 BETA 模式部署 - 这意味着它在完整的生产环境中运行(使用生产数据库 - 通常是生产数据;和生产 Web 服务器)。我们称该阶段为 BETA 测试。
主要要求之一是 BETA 代码升级到生产必须是从 beta 到生产目录的简单“cp”命令 - 没有代码/文件名更改。
对于非 Web Perl 代码,实现无缝 BETA 测试是完全可行的 (see details here):
- Perl 程序位于生产根目录 (
/usr/code/scripts) 下的标准位置,生产 perl 模块位于同一根目录 (/usr/code/lib/perl) 下 - BETA 代码具有 100% 相同的代码路径,但在 beta 根 (
/usr/code/beta/) 下除外 - 一个特殊的模块会根据脚本是从
/usr/code/scripts还是/usr/code/test/scripts调用来操作任何脚本的@INC,以包含用于测试脚本的测试库。
在我们需要对 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 模块,这将用于我的生产页面。
【问题讨论】:
标签: perl apache testing mod-perl perl-module