Несколько установщиков msi устанавливают один и тот же каталог

#wix #installation #exe #installshield #windows-installer

#wix #установка #exe #installshield #windows-установщик

Вопрос:

У меня есть два установщика msi, один для продукта A, созданного с помощью InstallShield, и один для продукта B, созданного с помощью WiX. Продукт B должен был запускаться поверх продукта A, но недавно некоторый код X был перенесен из B в A.

При новой установке проблем не возникает. Тем не менее, давайте предположим, что на сервере у меня установлены A.1 и B.1 (.1 = версия 1), где X устанавливается через B. И давайте предположим, что я хочу установить A.2, который теперь содержит X.

Будет ли обновлен код X? Что произойдет, если я попытаюсь удалить A.2 или B.1? Разрешено ли это вообще? Как я могу этого добиться?

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

1. Большой вопрос заключается в том, является ли эта установка InstallShield установкой на базе MSI. Это имеет огромное значение для ответов.

Ответ №1:

Это во многом зависит от нескольких вещей, которые вы не очень четко сформулировали, поэтому давайте немного углубимся в это. Я предполагаю, что начиная с версии 1, все файлы уникальны между установщиками или являются общими для общего доступа и не имеют отношения к коду, о переносе которого вы говорите (поэтому этот вопрос можно игнорировать).

Случай 1: Code X переносится между библиотеками DLL, например, A устанавливает a.dll ; B устанавливает b.dll , и код перемещается из b.dll чтобы a.dll

В этом случае, предполагая, что между двумя продуктами нет цепочек вызовов, вам нечего делать. Просто замените A.2 a.dll со следующей версией и B.2 заменить b.dll со следующей версией. Нет никаких проблем с порядком установки или множественным владением библиотеками DLL.

Этот подход должен работать при любом обновлении, если управление версиями DLL позволяет правильно заменять библиотеки DLL.

Если существует опубликованный интерфейс (например, COM-класс), то для обновления может потребоваться порядок, гарантирующий, что b.dll отказывается от ссылки на регистрацию до a.dll принимает его, однако эти изменения нарушают правила компонентов.

Случай 2: dll Code X мигрирует между установщиками, например, B устанавливает c.dll , и эта библиотека dll теперь вместо этого будет установлена

В этом случае ваш успех будет зависеть от качества вашей первоначальной разработки. Если c.dll устанавливается его собственным компонентом и помечается как общий, вы можете добавить этот компонент в A (в соответствии с его настройками), и обновление будет работать плавно в любом порядке. Если вы сначала установите A.2, он увеличит количество ссылок, поэтому установка B.2 приведет к отмене ссылки, но не удалит ее. Если вы сначала установите B.2, он временно удалит c.dll , но установка A.2 восстановит его. Удаление будет работать аналогично, отслеживая количество ссылок и удаляя при необходимости.

Но это предполагает серьезное обновление. Если вы используете незначительное обновление (независимо от того, поставляется ли оно как .msp или .msi), вы находитесь в гораздо более сложном сценарии. Чтобы путь обновления B был чистым, он должен содержать c.dll компонент вокруг и выберите альтернативный подход для удаления c.dll . Однако все известные мне подходы конфликтуют с установкой точной копии того же компонента в том же месте. В этом случае сначала должна сработать установка B.2, но вторая установка может привести к удалению c.dll .

Если незначительные обновления могут работать корректно, вам, возможно, придется также рассмотреть случай удаления исправления, но поскольку они не могут, я не буду здесь это описывать.