понедельник, 20 сентября 2010 г.

Upgrade, No Upgrade....

Последняя попытка "бесшовного upgrade'a" с предыдущей версии нашей системы на вновь выпускаемую принесла много интересных открытий - одно из них заключается в том, что правильно модули Windows Installer вообще могут писать немногие...

Все началось с того, что в процессе проверки обновления предыдущей версии продукта на новую появились жалобы, что после окончания процесса обновления система не запускается из-за некорректной работы драйверов защиты (мы используем ключи SafeNet SuperPro).

Как всегда, истина проявилась ближе к концу, выяснилось, что тестеры при проверке используют установку в конфигурации "Custom" (не изменяя состава компонентов), а все базовые тесты при разработке проводились в конфигурации "Typical"/"Complete".

Cравнение протоколов и показало отличие - в первом случае не вызывался целый ряд CustomAction'ов для установки драйверов.

Пришлось лезть в Merge-модули из состава Sentinel SDK - тут-то и стало все ясно: все функции вызывались только если свойство REMOVE не содержало ничего... Как назло, в конфигурации "Custom" оно содержало список не устанавливаемых по умолчанию модулей языковой поддержки. Вроде бы ничего не меняли в составе устанавливаемых компонентов - а результат-то с точки зрения системы уже совсем другой...

История окончилась хорошо, особенно с учетом того, что нам пришлось обеспечивать работу системы одновременно еще и под Win64, что потребовало написания новых вызовов в InstallExecuteSequence - мы просто отказались от использования Merge-модуля, но осадок остался.

Если Вы берете готовые решения "под ключ" от производителя - это еще совсем не значит, что все обо всем подумали :-)

Кстати, об отладке - наиболее эффективным способом все-таки явилось сравнение двух протоколов инсталляции.
Для эффективного анализа в обоих файлах все временные метки заменяются на нечто однотипное (вроде XX:XX:XX) с помощью regexp, имена временных файлов также унифицируются - обычно после этого отличия бросаются в глаза.
Да, и не нужно забывать, что очень помогает вывод подробного протокола - для msiexec это ключ вида "/l*xv", что позволяет получить много дополнительной информации.

Комментариев нет: