Невозможно удалить предыдущие версии MSI. Несколько записей отображаются на панели управления
Я не уверен, что я что-то упустил или просто тупой, проблема, связанная с удалением MSI. В основном я создаю приложение и использую WIX для создания установщика MSI. Происходит то, что я могу установить предыдущую версию приложения, но не могу перейти на более новую версию MSI. Например, когда я нажимаю / устанавливаю более новую версию MSI, затем устанавливаем более старый MSI, оба MSI отображаются на панели управления (MyApp 1.5.0, MyApp 1.6.0).
Я почти уверен, что у меня настроен "MINORUPGRADE/MAJORUPGRADE" вместе с действием RemoveExistingProducts, но эта проблема все еще возникает.
Я попытался изменить значения MINORUPGRADE / MAJORUPGRADE и свойство RemoveExistingProducts, но все равно получил то же поведение.
Моя конфигурация WIX выглядит следующим образом (без каталогов / путей...)
<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
<Product Id="*" Language="1033" Manufacturer="MyApp" Name="MyApp $(env.APP_BASE_VERSION)" UpgradeCode="$(env.UPGRADE_CODE)"
Version="$(env.APP_BASE_VERSION)">
<Package Compressed="yes" InstallerVersion="200" InstallScope="perMachine" InstallPrivileges="elevated" Description="MyApp $(env.APP_VERSION) Installer"
Comments="" Manufacturer="MyApp" />
<Property Id="MsiLogging" Value="v!" />
<MediaTemplate EmbedCab="yes" CompressionLevel="$(env.COMPRESSION_LEVEL)"/>
<Icon Id="icon.ico" SourceFile="$(env.STATIC_RESOURCE_PATH)\icon.ico" />
<Property Id="ARPPRODUCTICON" Value="icon.ico" />
<Upgrade Id="$(env.UPGRADE_CODE)">
<UpgradeVersion
Property="MAJORUPGRADE"
Minimum="0.0.0.0"
IncludeMinimum="yes"
Maximum="$(env.APP_BASE_VERSION)"
IncludeMaximum="no"
IgnoreRemoveFailure="no"
MigrateFeatures="yes" />
<UpgradeVersion
Property="MINORUPGRADE"
Maximum="$(env.APP_BASE_VERSION)"
Minimum="$(env.APP_BASE_VERSION)"
IncludeMinimum="yes"
IncludeMaximum="yes"
/>
</Upgrade>
...
<CustomAction Id="Remove_Roaming_MyApp" Directory="TARGETDIR" ExeCommand="cmd.exe /C "rmdir /s /q "[AppDataFolder]\MyApp""" Execute="deferred" Return="ignore" HideTarget="yes" Impersonate="no" />
<Property Id="WixShellExecTarget" Value="[#MyAppEXE]" />
<CustomAction Id="LaunchApplication" BinaryKey="WixCA" DllEntry="WixShellExec" Impersonate="yes" />
<util:CloseApplication Id="CloseApp" Target="MyApp.exe" RebootPrompt="no" CloseMessage="yes"/>
<CustomAction Id="Kill_MyApp_instances"
Directory="TARGETDIR"
ExeCommand="taskkill.exe /IM MyApp.exe /F"
Execute="deferred"
Return="ignore" HideTarget="yes" Impersonate="no" />
<!-- This will create a log in the Temp folder of the user profile by default. NOTE: this is not the full log! The MSI will need to be ran with `/l*v <destination file>` -->
<CustomAction Id="CopyLog_partial"
ExeCommand="cmd /c copy "[MsiLogFileLocation]" "%SystemDrive%\Windows\Temp\MyApp-msi.log""
Directory="TARGETDIR"
Impersonate="no"
Execute="commit"
Return="ignore" />
<CustomAction Id="CopyLog_full"
ExeCommand="cmd /c copy "[MsiLogFileLocation]" "[LocalAppDataFolder]\Temp\MyApp-msi.log""
Directory="TARGETDIR"
Impersonate="no"
Execute="immediate"
Return="ignore" />
<InstallExecuteSequence>
<RemoveExistingProducts Before="InstallValidate" />
<Custom Action="WixCloseApplications" Before="InstallValidate" />
<Custom Action="Kill_MyApp_instances" After='InstallInitialize'></Custom>
<Custom Action="LaunchApplication" After='InstallFinalize'>NOT Installed</Custom>
<Custom Action="CopyLog_partial" After="PublishProduct" />
<Custom Action="CopyLog_full" OnExit="success" />
</InstallExecuteSequence>
<Feature Id="ProductFeature" Title="SetupProject1" Level="1">
<ComponentGroupRef Id="ELECTRON_FRAGMENTS"/>
<ComponentRef Id="Remove_MyApp_Roaming_comp" />
<ComponentRef Id="Remove_uninstallCache_folder" />
<ComponentRef Id="Remove_MyApp_programFiles_comp" />
<ComponentRef Id="Shortcut_startMenu" />
</Feature>
</Product>
</Wix>
Предполагаемое поведение - удалить предыдущий MSI или, что еще лучше, все версии, установленные в процессе установки MSI. Я знаю, что это можно сделать с помощью CustomAction, но мне было интересно, есть ли более элегантный способ сделать это?
1 ответ
Резюме: когда вы получаете две записи в
Add / Remove Programs
серьезное обновление не удалось. Я предлагаю вам закомментировать все основные конструкции обновления и постараться получить сердцебиение с помощью самых простых доступных конструкций - описанных ниже.
Major Upgrade: вы использовали старые конструкции для реализации вашего основного обновления. Существует более новый и простой способ, например:
<MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
Это что-то вроде "шаблона", реализующего серьезное обновление с наименьшим количеством запаха, просто используя "обычные опции" или упрощенные опции, если хотите. Там нет необходимости добавлять свои собственные RemoveExistingProducts
запись, когда вы используете этот шаблон, на самом деле это, вероятно, приведет к "дубликат записи / символ" при компиляции:
- Добавить
MajorUpgrade element
выше.- Закомментируйте весь
Upgrade element
,- Закомментируйте
RemoveExistingProducts
элемент.
Старые конструкции: The MajorUpgrade element
этого будет достаточно для реализации работающего крупного обновления, но вы все равно можете использовать старые конструкции WiX (элементы Upgrade и UpgradeVersion), чтобы получить более детальный контроль над созданием Upgrade table
, Именно эта таблица определяет, как должны обрабатываться существующие установки. Таблица обновления идентифицирует связанные продукты, сопоставляя коды обновления, а затем выполняет любое действие, определенное для этого сценария в Upgrade table
сам.
Предыдущие ответы: Есть несколько старых ответов на эту тему, пожалуйста, смотрите следующее:
- При выполнении Major Upgrade в Wix создается 2 записи в разделе "Установка и удаление программ".
- Добавление записей в MSI UpgradeTable для удаления связанных продуктов (это показывает, как использовать как более новую конструкцию шаблона, так и более старый элемент WiX для "детального" управления таблицей обновлений).
Еще несколько ссылок: