У нас есть установка, в которой большая часть кода перед переходом на полную версию развертывается в режиме BETA, то есть работает в полной рабочей среде (с использованием рабочей базы данных - обычно производственных данных и рабочего веб-сервера).Мы называем этот этап бета-тестированием.
Одним из основных требований является то, что продвижение кода бета-версии в производство должно быть простой командой "cp" из бета-версии в производственный каталог - без изменений кода / имени файла.
Для не-веб-кода Perl выполнение бесшовного теста BETA вполне выполнимо ( см. Подробности здесь ):
- Программы на Perl живут в стандартном месте под рабочим рутом (
/usr/code/scripts
) с производственными модулями Perl, живущими в одном корне (/usr/code/lib/perl
) - Код BETA имеет 100% одинаковых путей кода, за исключением корневого бета-версии (
/usr/code/beta/
) - Специальный модуль управляет
@INC
любого сценария, основанного на том, был ли сценарий вызван из /usr/code/scripts
или /usr/code/test/scripts
, чтобы включить бета-библиотеки для бета-сценариев.
Эта установка работает нормально, пока нам не потребуется бета-тестирование нашеговеб-Perl-код (установка EmbPerl и Apache / mod_perl).
Зависание следующее: , если и рабочий модуль Perl, и модуль BETA Perl имеют одинаковые имена (например, /usr/code/lib/perl/MyLib1.pm
и /usr/code/beta/lib/perl/MyLib1.pm
), тогда mod_perl сможет загрузить ОДИН из этих модулей в память - и мы не знаем, какая конкретная веб-страница может повлиять на то, какая версия модуля загружена в настоящее время из-за проблем параллелизма.
Оставляя в стороне очевидное непрограммное решение (получите кровавый веб-сервер BETA), которое по политическим / организационным причинам неосуществимо, есть ли какой-нибудь способ, которым мы можем как-то взломать эту проблему в Perl или mod_perl?
Я поиграл с различными подходами к выгрузке модулей Perl, перечисленных в %INC
, но проблема остается в том, что другой пользователь может загрузить бета-страницу в нужный момент (или, скорее, неправильно) и получить бета-модульзагружен, который будет использоваться для моей производственной страницы.