Как заставить работать главное обновление WiX? - PullRequest
15 голосов
/ 16 февраля 2010

Я изо всех сил пытаюсь включить основные функции обновления в WiX.

Я хочу, чтобы каждая новая версия установщика была серьезным обновлением (полная деинсталляция, затем новая установка), поскольку нам не нужны разные версии обновления и чистой установки.

Я начал пытаться сделать это с помощью тегов, но я продолжал получать "Другая версия установлена". сообщение об ошибке при запуске установщика.

Поэтому я реализовал новый тег, добавленный в V3.5, чтобы упростить обновление. Я все еще получаю сообщение об ошибке.

Затем я где-то читал, что вам нужно менять идентификатор GUID для каждой новой версии. Поэтому я установил Id = "*", чтобы WiX генерировал их.

Теперь, когда я устанавливаю более новую версию, она не удаляет старую версию, и в результате вы получаете две установки в одну и ту же папку. Я решил это, потому что запуск MSI (нового или старого) вызовет экран восстановления / удаления.

Также программа не была перезаписана новой версией.

Вот начало моего скрипта WiX:

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">

    <Product Id="*"
             Name="Foo"
             Language="1033"
             Codepage="1252"
             Version="!(bind.FileVersion.Foo.exe)"
             Manufacturer="Foo Bar Ltd."
             UpgradeCode="dac2fab2-7d76-4e47-b25f-0748380dab81">

        <Package
                 Description="Foo"
                 Comments="This installer database contains the logic and data required to install Foo."
                 InstallerVersion="300"
                 Languages="1033"
                 SummaryCodepage="1252"
                 Platform="x86"
                 Compressed="yes" />

        <!-- Remove older versions -->
        <!-- Important note: MSI ignores the last version digit 1.0.0.? when comparing versions, so always change at least the 3rd digit for new external releases-->
        <MajorUpgrade DowngradeErrorMessage="The version currently installed is newer than the version you are attempting to install."/>

Ответы [ 3 ]

21 голосов
/ 16 февраля 2010

Вот фрагмент того, что я использую для всех своих пакетов, улучшенный во многих внутренних и общедоступных выпусках

<Product Id="*"
         UpgradeCode="$(var.Property_UpgradeCode)"
         Name="!(loc.ApplicationName)"
         Language="!(loc.Property_ProductLanguage)"
         Version="$(var.version)"
         Manufacturer="!(loc.ManufacturerName)" >

    <Package Description="!(loc.Package_Description) $(var.version)"
           Comments="!(loc.Package_Comments)"
           Manufacturer="!(loc.ManufacturerName)"
           InstallerVersion="301"
           Compressed="yes"
           InstallPrivileges="elevated"
           InstallScope="perMachine"
           Platform="$(var.ProcessorArchitecture)" />

    <Media Id="1" Cabinet="media1.cab" EmbedCab="yes" />

    <Upgrade Id="$(var.Property_UpgradeCode)">
        <UpgradeVersion OnlyDetect="yes"
                        Minimum="$(var.version)"
                        Property="NEWERVERSIONDETECTED"
                        IncludeMinimum="no" />

        <UpgradeVersion OnlyDetect="no"
                        Maximum="$(var.version)"
                        Property="OLDERVERSIONBEINGUPGRADED"
                        IncludeMaximum="no" />

        <!-- Detect for changes in 4th field only -->
        <UpgradeVersion Property="ANOTHERBUILDINSTALLED"
                 Maximum="$(var.version)" Minimum="$(var.version)"
                 IncludeMinimum="yes" IncludeMaximum="yes" OnlyDetect="yes" />

    </Upgrade>

    <CustomAction Id="CA_BlockOlderVersionInstall" Error="!(loc.LaunchCondition_LaterVersion)" />
    <CustomAction Id="CA_BlockAnotherBuildInstall" Error="!(loc.LaunchCondition_AnotherBuild)" />

    <InstallExecuteSequence>
        <Custom Action="CA_BlockOlderVersionInstall" After="FindRelatedProducts">
            <![CDATA[NEWERVERSIONDETECTED]]>
        </Custom>

        <!-- Prevent installation on 4th version field change only -->
        <Custom Action="CA_BlockAnotherBuildInstall" After="FindRelatedProducts">
            <![CDATA[ANOTHERBUILDINSTALLED]]>
        </Custom>

        <LaunchConditions After="AppSearch" />

        <!-- Schedule RemoveExistingProducts early -->
        <RemoveExistingProducts After="InstallInitialize" />
    </InstallExecuteSequence>

    <InstallUISequence>
        <Custom Action="CA_BlockOlderVersionInstall" After="FindRelatedProducts">
            <![CDATA[NEWERVERSIONDETECTED]]>
        </Custom>

        <!-- Prevent installation on 4th version field change only -->
        <Custom Action="CA_BlockAnotherBuildInstall" After="FindRelatedProducts">
            <![CDATA[ANOTHERBUILDINSTALLED]]>
        </Custom>

        <LaunchConditions After="AppSearch" />
    </InstallUISequence>

    <!-- .... -->

</Product>
1 голос
/ 16 декабря 2013

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

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

<Property Id='ALLUSERS' Value='1'/>

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

Жаль, что панель управления Windows не проводит четких различий между установками для каждого пользователя и для всех пользователей.

1 голос
/ 13 апреля 2012

Я знаю, что это сообщение старое и на него ответили, но, если кто-нибудь столкнется с этим, у меня возникли проблемы с установщиком обновления. Разделы обновления были все в порядке. Установщик запустится, но предыдущая версия не была удалена, поэтому новая версия не была установлена. Проблема была в этом

<Feature Id="ProductBinaries" Title="ProductBinariesInstaller" Level="0">

Уровень = "0" выше, должен был быть Уровень = "1", как и ниже:

<Feature Id="ProductBinaries" Title="ProductBinariesInstaller" Level="1">

Scott

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