Обнаружение удаления в состоянии запуска с помощью MSI Wix - PullRequest
2 голосов
/ 10 марта 2010

Я поигрался с Wix, создав небольшое приложение с автоматически сгенерированным установщиком и тремя версиями для проверки возможности обновления, 1.0, 1.1 и 2.0.

1.1 предназначено для возможности обновления с версии 1.0 и не позволяет пользователю устанавливать 1.1, если 1.1 уже присутствует.

        <Upgrade Id="MY_UPGRADECODE_GUID">
            <UpgradeVersion Minimum="1.0.0"
                                            IncludeMinimum="yes"
                                            Maximum="1.0.0"
                                            IncludeMaximum="yes"
                                            Property="OLDERVERSIONBEINGUPGRADED" />
            <UpgradeVersion Minimum="1.1.0"
                                            IncludeMinimum="yes"
                                     OnlyDetect="yes"
                                     Property="NEWERVERSIONDETECTED" />
        </Upgrade>

        <Condition Message="A later version of [ProductName] is already installed. Setup will now exit.">
            NOT (NEWERVERSIONDETECTED OR Installed)
        </Condition>

Проблема № 1: 1.1 не может быть удалена, потому что условие установлено и проверено во время удаления.

2.0 предназначен для возможности обновления с версии 1.1, а не для обновления с версии 1.0 («слишком старый»). Он также не может быть установлен поверх себя.

    <Upgrade Id="MY_UPGRADECODE_GUID">
        <UpgradeVersion Minimum="1.1.0"
        IncludeMinimum="yes"
        Maximum="1.1.0"
        IncludeMaximum="yes"
        Property="OLDERVERSIONBEINGUPGRADED" />
    </Upgrade>

    <Upgrade Id="MY_UPGRADECODE_GUID">
        <UpgradeVersion Minimum="2.0.0"
        OnlyDetect="yes"
        Property="NEWERVERSIONDETECTED" />
    </Upgrade>

    <Upgrade Id="MY_UPGRADECODE_GUID">
        <UpgradeVersion Minimum="1.0.0"
        IncludeMinimum="yes"
        Maximum="1.0.0"
        IncludeMaximum="yes"
        Property="TOOOLDVERSIONDETECTED" />
    </Upgrade>  

    <Condition Message="A later version of [ProductName] is already installed. Setup will now exit.">
        NOT NEWERVERSIONDETECTED OR Installed
    </Condition>

    <Condition Message="A version of [ProductName] that is already installed is too old to be upgraded. Setup will now exit.">
        NOT TOOOLDVERSIONDETECTED
    </Condition>

Проблема № 2: Если я пытаюсь обновить версию 1.1, я сталкиваюсь с измененным состоянием более поздней версии. (Ошибка: более поздняя версия основного приложения 1.1 уже установлена. Программа установки завершит работу.) Проблема № 3: Установщик позволяет мне установить 2.0 поверх самого себя.

Что я делаю не так с моим кодом обновления и условиями, чтобы получить эти проблемы в моих MSI?

Ответы [ 2 ]

3 голосов
/ 10 марта 2010

ОК, я понял, что есть хитрость, которую вы можете использовать для обнаружения деинсталляций.

Моя версия 1.1 WXS изменена на:

        <Condition Message="A later version of [ProductName] is already installed. Setup will now exit.">
            NOT NEWERVERSIONDETECTED OR REMOVE ~= "ALL"
        </Condition>

и в версии 2.0:

        <Condition Message="A later version of [ProductName] is already installed. Setup will now exit.">
            NOT NEWERVERSIONDETECTED OR REMOVE ~= "ALL"
        </Condition>

        <Condition Message="A version of [ProductName] that is already installed is too old to be upgraded. Setup will now exit.">
            OLDERVERSIONBEINGUPGRADED OR (NOT Installed AND NOT TOOOLDVERSIONDETECTED) OR REMOVE ~= "ALL"
        </Condition>

Таким образом, мои LaunchConditions никогда не будут срабатывать при удалении и будут правильно определять, с какой версии обновляется какая-либо.

1 голос
/ 12 марта 2010

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

Если это так, то вам не нужно ничего делать, чтобы явно запретить пользователю устанавливать приложение 1.1, когда приложение 1.1 уже установлено. Служба установщика распознает, что приложение 1.1 уже установлено, и не позволит вам установить его снова. Это собирается подняться в режиме обслуживания. Он думает, что вы хотите добавить или удалить функцию, или, возможно, удалить продукт.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...