Извините, что восстанавливаю старую публикацию, но поскольку в WiX 3.10 для нее все еще нет встроенной поддержки, я подумал, что опубликую свой обходной путь.
Предостережение в отношении этого метода заключается в том, что двойной щелчок по только что установленному пакету не вызовет обычного диалогового окна «изменить, удалить». То, что я сделал, чтобы справиться с этим, помещено в <bal:Condition>
, который инструктирует пользователя использовать «Добавить и удалить программы», если они хотят вызвать функцию удаления или изменения.
Причина, по которой мне это вообще нужно, а не просто увеличивать версию для выполнения обновления, заключается в том, что у нас есть онлайн- и офлайн-пакеты. Я хочу предотвратить их одновременную установку.
Еще одна вещь, которую требует этот подход, - это чтобы идентификатор версии вашего пакета совпадал с идентификатором версии MSI. Достаточно заявлений об отказе от ответственности, вот подход:
Создайте поиск продукта, но, что важно, используйте UpgradeCode
для вашего пакета MSI, а не для пакетов! ProductSearch никогда не найдет GUID вашего пакета, потому что пакет является .exe, а не MSI.
<util:ProductSearch
Variable="BundleAlreadyInstalled"
UpgradeCode="MSI-GUID-NOT-BUNDLE-GUID"
Id="BundleAlreadyInstalledSearch"
Result="version"
/>
Затем внутри ваших <bundle>
элементов добавьте следующее:
<Variable Name="CurrentVersionNumber" Type="string" Value="$(var.Version)" />
<bal:Condition Message="Tell your user to use Add Remove Programs here.">
NOT WixBundleAction = 5 OR NOT BundleAlreadyInstalled = CurrentVersionNumber
</bal:Condition>
Суть взлома здесь заключается в том, что мы используем версию MSI (которая, как я уже сказал, по этой причине должна соответствовать версии пакета) в качестве ключевого индикатора того, присутствует ли этот пакет в целевой системе.
Если вы не включите NOT WixBundleAction = 5
, вы не сможете удалить приложение, что отчасти важно.
Что касается второй части, мы хотим специально определить, установлена ли уже эта версия. Обновления и понижения не пройдут этот тест, что мы и хотим, потому что нормальная логика сработает и выполнит ваше обновление / понижение.
Без этой логики мои пользователи могли одновременно устанавливать как онлайн, так и офлайн версии пакета. Основная причина этого в том, что Bundle@Id
генерируется WiX. Еще одна более тонкая проблема, которую это исправляет, заключается в том, что простое перестроение пакета без изменения версии также позволит вам установить его бок о бок! Вы получите повторяющиеся записи в «Добавить и удалить программы» для всех этих вещей.
Эти проблемы полностью предотвращаются этими несколькими строками кода. Как я уже упоминал, компромисс заключается в том, что установка и последующий запуск того же пакета снова не вызовет диалоговое окно удаления, но с этим намного проще жить, чем с дублированием записей ARP. Тем более, что вы можете просто предоставить инструкции в сообщении об ошибке.
person
IKx2cf
schedule
14.02.2017