Как заставить работать главное обновление WiX?
Я изо всех сил пытаюсь включить основные функции обновления в 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 ответа
Вот фрагмент того, что я использую для всех своих пакетов, улучшенный во многих внутренних и публичных выпусках
<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>
Если это пригодится тем, кто обнаружит эту тему, я также столкнулся с подобной проблемой, которую только что выяснил.
В моем случае (и все еще находившемся на ранних стадиях разработки моего установщика), критическим отличием было то, что между версиями я переключился с установки для каждого пользователя на установку для каждой машины. В частности, я добавил следующую строку в мой Product.wxs:
<Property Id='ALLUSERS' Value='1'/>
Я до сих пор разбираюсь со многими особенностями установщиков Windows, но я предполагаю, что переключение типа установки таким образом будет сравнимо с переходом к взаимоисключающему потоку версий во многих отношениях (даже при включении двух идентичные версии должны быть установлены параллельно!).
Обидно, что панель управления Windows не проводит четкого различия между установками для каждого пользователя и для всех пользователей.
Я знаю, что это сообщение старое и на него ответили, но, если кто-то столкнется с этим, у меня возникли проблемы с установщиком обновлений. Разделы обновления были все в порядке. Установщик запустится, но предыдущая версия не была удалена, поэтому новая версия не была установлена. Проблема была в этом
<Feature Id="ProductBinaries" Title="ProductBinariesInstaller" Level="0">
Уровень = "0" выше, должен был быть Уровень ="1", как и ниже:
<Feature Id="ProductBinaries" Title="ProductBinariesInstaller" Level="1">
Скотт