Обновите пакет загрузчика, если обнаружена та же версия

У меня есть комплект загрузчика WiX:

<Bundle Name="blah" Version="1.0.0" Manufacturer="blah" UpgradeCode="some-guid-string">

Когда я создаю новую сборку и пытаюсь установить ее поверх предыдущей, загрузчик должен обновить себя (так как это та же версия), однако старая версия останется лежать в папке «Программы и компоненты». Что я могу сделать, чтобы полностью удалить предыдущую версию при установке поверх той же версии, и как я могу удалить старую сборку из программ и компонентов? Я искал в Интернете, но нет четких ответов по этой теме.

Изменить: Это question намекает на использование настраиваемого BA для переопределения режима бездействия по умолчанию путем изменения состояния запроса в OnPlanRelatedBundle. Я не уверен, что люди имеют в виду под этим, или как я могу подключиться к OnPlanRelatedBundle ... может кто-нибудь уточнить? Custom BA = настраиваемое действие сборки?


person Alexandru    schedule 27.10.2014    source источник


Ответы (3)


Извините, что восстанавливаю старую публикацию, но поскольку в 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
comment
Хороший обходной путь. Обратите внимание, что этот подход не работает, когда у вас есть mba, поскольку он использует bal - person Shique; 27.11.2019

Попробуйте указать элемент RelatedBundle в загрузчике.

<RelatedBundle Id="THE-BUNDLE-UPGRADE-GUID" Action="Upgrade"/>
person BoilerBrad    schedule 19.02.2015

Я нашел способ решения моей проблемы, не изменяя исходный код записи WiX.

Я отключил отображение моего пакета загрузчика в программах и компонентах:

<Bundle DisableRemove="yes" DisableModify="yes" ... />

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

<MsiPackage Visible="yes" ... />
person Alexandru    schedule 27.10.2014
comment
Скорее всего, вы все еще устанавливаете повторяющиеся пакеты, вы просто не видите их в «Установка и удаление программ» ... - person BoilerBrad; 19.02.2015