Как обнаружить изменение кода пакета при обновлении (Small Update)
У меня есть продукт под названием MyApp. Этот продукт поставляется с различными версиями, такими как BASIC и PRO. Обе редакции имеют свой собственный установщик с одинаковой версией.
После того, как я установил версию BASIC и запустил установщик PRO, я хочу, чтобы InstallShield обнаружил это. Общее созвездие показано на следующем рисунке.
- UpCo = код обновления
- PrCo = код продукта
- PaCo = код пакета
Черные стрелки обрабатываются как Major Upgrades без проблем. Красные стрелки иллюстрируют проблему.
Слишком детально обнаружив этот сценарий, я подумал о проверке измененного кода пакета. По следующей ссылке этот сценарий определяется как Small Update.
- Есть ли такое свойство, как IS_MINOR_UPGRADE или IS_MAJOR_UPGRADE, которое я могу использовать?
- Можно ли узнать код пакета, код продукта и код обновления предыдущей и текущей установки? Затем я мог бы сравнить эти значения и ответить на этот сценарий в InstallScript.
1 ответ
Если в этом сценарии не установлено значение IS_MINOR_UPGRADE, такого свойства не существует. Возможно, вы сможете написать настраиваемое действие, которое проверяет текущую записанную информацию об установленном пакете (см. MsiGetProductInfo), но вы можете быстро столкнуться с ограничениями API-интерфейсов установщика Windo ws, которые вы можете вызывать внутри настраиваемого действия.
Предполагая, что между вашими изданиями есть разные файлы (то есть разные имена, а не только разные сборки одного и того же имени файла), я думаю, у вас возникнут проблемы с перемещением "влево" и "вправо". Это может привести к потере компонентов на машине, если будет выполнено хотя бы одно из направлений. Я бы предложил использовать один из этих альтернативных подходов:
- Используйте разные коды продуктов и, возможно, также разные коды обновлений (вы можете добавить несколько основных обновлений, чтобы использовать стратегию, аналогичную ISPreventDowngrade, чтобы предотвратить параллельные установки)
- Рефакторинг для меньших MSI (например, один для общих файлов и один для различных файлов для каждого издания; последний может быть взаимоисключающим, как в предыдущем пункте), возможно, распространяемый проектом Suite/Advanced UI, или
- Используйте не-установщик лицензирования для обеспечения соблюдения ваших выпусков