Невозможно удалить предыдущие версии MSI. Несколько записей отображаются на панели управления - PullRequest
1 голос
/ 23 мая 2019

Я не уверен, что что-то упустил или просто тупой, проблема, связанная с удалением 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 &quot;rmdir /s /q &quot;[AppDataFolder]\MyApp&quot;&quot;" 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 &quot;[MsiLogFileLocation]&quot; &quot;%SystemDrive%\Windows\Temp\MyApp-msi.log&quot;" 
      Directory="TARGETDIR" 
      Impersonate="no" 
      Execute="commit" 
      Return="ignore" />
    <CustomAction Id="CopyLog_full"
      ExeCommand="cmd /c copy &quot;[MsiLogFileLocation]&quot; &quot;[LocalAppDataFolder]\Temp\MyApp-msi.log&quot;" 
      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 Ответ

0 голосов
/ 24 мая 2019

Сводка : при получении двух записей в Add / Remove Programs основное обновление завершилось неудачно. Я предлагаю вам закомментировать все основные обновления конструкции и попытаться получить сердцебиение с простейшими конструкциями доступно - объяснено ниже.


Большое обновление : Вы использовали старые конструкции для реализации своего основного обновления. Существует более новый и простой способ, подобный этому:

<MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />

Это что-то вроде «шаблона», реализующего основное обновление с наименьшим количеством пуша, просто используя «обычные опции» или упрощенные опции, если хотите. При использовании этого шаблона нет необходимости добавлять свою собственную запись RemoveExistingProducts, фактически, при компиляции это, вероятно, приведет к «повторяющейся записи / символу»:

  • Добавьте MajorUpgrade element выше.
  • Закомментируйте все Upgrade element.
  • Закомментируйте элемент RemoveExistingProducts.

Старые конструкции : MajorUpgrade element будет достаточно для реализации работающего крупного обновления, но вы все равно можете использовать старые конструкции WiX ( Обновите и UpgradeVersion элементов), чтобы получить более детальный контроль над созданием Upgrade table. Именно эта таблица определяет, как должны обрабатываться существующие установки. Таблица обновления идентифицирует связанные продукты путем сопоставления кодов обновления, а затем выполняет любое действие, определенное для этого сценария в самом Upgrade table.

Предыдущие ответы : есть несколько более старых ответов на эту тему, пожалуйста, смотрите следующее:


Еще несколько ссылок :

...