Подтвердить что ты не робот

Как получить wix для обновления ранее установленной версии программы

Я написал программу установки с помощью wix, и она отлично работала для установки моей программы. Теперь мне нужно обновить его, поэтому я столкнулся с номером версии, но когда я иду, чтобы установить новую программу поверх старой, он жалуется, что старая версия уже установлена ​​и говорит мне сначала удалить ее.

Как мне его обновить или автоматически удалить, прежде чем переустанавливать?

4b9b3361

Ответ 1

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

  • Убедитесь, что ваш идентификатор продукта изменяется каждый раз, когда вы строите. Если вы этого не сделаете, вы всегда получите сообщение "уже установлено", о котором упомянул OP.

    <Product Id="*" ...>
    
  • Измените версию продукта каждый раз, когда сам продукт изменится. Я полагаю, что лучшим вариантом является привязка его к версии сборки (которая также должна быть автоматически добавлена), но, конечно, вы также можете просто изменить ее вручную. Этот шаг не является строго обязательным, если вы используете атрибут AllowSameVersionUpgrades в пункте 4, но я бы рискнул сказать, что сохранение постоянной версии продукта - это плохая практика в любом случае.

    <Product Version="!(bind.FileVersion.MyAssemblyDll)" ...>
    <File Id="MyAssemblyDll" Name="$(var.001_Application.MyAssembly.TargetFileName)" Source="$(var.001_Application.MyAssembly.TargetPath)" />
    
  • Сохраняйте постоянную константу обновления (например):

    <Product UpgradeCode="f4d7f199-28f6-45d5-ad99-7c62938274be" ...>
    
  • Добавьте элемент MajorUpgrade (из Wix 3.5.1315.0). Чтобы обойти уловку, что MajorUpgrade проигнорирует изменения в номере версии версии продукта, добавьте атрибут AllowSameVersionUpgrades (или, если вы предпочитаете AllowDowngrades). Таким образом, вы сможете обновить, например, 1.0.0.7 до 1.0.0.8. а не только от 1.0.7.0 до 1.0.8.0. Если вы этого не сделаете, вы можете увидеть несколько установок в программах и функциях.

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

Здесь мой весь .wix файл (соответствующие части, два фрагмента, которые приводят к сборке, которая используется для привязки продукта, в основном необязательны и для иллюстрации, любой способ захвата сборки будет работать):

<?xml version="1.0" encoding="UTF-8"?>
<?define ProductVersion="!(bind.FileVersion.MyAssemblyDll)"?>
<?define UpgradeCode="f4d7f199-28f6-45d5-ad99-7c62938274be"?>

<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" xmlns:netfx="http://schemas.microsoft.com/wix/NetFxExtension">
  <Product
    Id="*"
    Name="My Product name"
    Language="1033"
    Version="$(var.ProductVersion)"
    Manufacturer="My company"
    UpgradeCode="$(var.UpgradeCode)"
    Codepage="1252">

    <Package
      InstallerVersion="200"
      Compressed="yes"
      InstallScope="perUser"
      Description="My product description"
      Manufacturer="My company"
      Languages="1033"
      SummaryCodepage="1252"
      InstallPrivileges="limited" />

    <MajorUpgrade AllowSameVersionUpgrades="yes" 
                  DowngradeErrorMessage="A newer version of [ProductName] is already installed. If you are sure you want to downgrade, remove the existing installation via Programs and Features." />

  </Product>

  <Fragment>
    <Directory Id="TARGETDIR" Name="SourceDir">
      <Directory Id="LocalAppDataFolder">
        <Directory Id="INSTALLFOLDER" Name="My Install Dir" >
          <Component Id="INSTALLFOLDER" Guid="f6ba8a12-6493-4911-8edd-dce90e1d8e8b" >
            <RemoveFolder On="both" Id="INSTALLFOLDER"/>
            <RegistryValue Root="HKCU" Key="Software\[Manufacturer]\[ProductName]" Type="string" Value="My Registry value" />
          </Component>
        </Directory>
      </Directory>
    </Directory>
  </Fragment>

  <Fragment>
    <ComponentGroup Id="ProductComponents" >
      <Component Id="ProductComponent" Guid="1939f0f5-19f6-498b-bf95-8f1c81501294" DiskId="1" Directory="INSTALLFOLDER" >
        <File Id="MyAssemblyDll" Name="$(var.001_MyApplication.MyAssembly.TargetFileName)" Source="$(var.001_MyApplication.MyAssembly.TargetPath)" />
      </Component>
    </ComponentGroup>
  </Fragment>
</Wix>

Ответ 2

Я просмотрел все сообщения, упомянутые выше, и все еще потратил на это время, пытаясь заставить это работать.

подсказка на

Я использовал этот раздел обновления (дочерний элемент Product):

<Upgrade Id="$(var.UpgradeCode)">
  <UpgradeVersion Minimum="1.0.0"
                  IncludeMinimum="yes"
                  OnlyDetect="no"
                  Maximum="$(var.Version)"
                  IncludeMaximum="no"
                  Property="PREVIOUSFOUND" />
</Upgrade>

Обратите внимание, что для параметра OnlyDetect установлено значение "нет". Это вызывает удаление старой версии, если у вас есть следующий раздел (дочерний элемент Product):

<InstallExecuteSequence>
  <RemoveExistingProducts After="InstallInitialize"/>
</InstallExecuteSequence>

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

Ответ 3

вам нужно использовать таблицу обновления:

< Upgrade Id='15E2DAFB-35C5-4043-974B-0E342C25D76A'>
    < UpgradeVersion Property='OLDVERSIONFOUND' IncludeMinimum='no' Minimum='0.0.0.0' />
< /Upgrade>

вам также нужно добавить действие:

    < InstallExecuteSequence>
          < LaunchConditions After='AppSearch' />
          < RemoveExistingProducts After='InstallValidate' />
    < /InstallExecuteSequence>

вот учебник

Ответ 4

Я попробовал это, и это сработало для меня.

  • Поместите свой тег продукта следующим образом:

    Идентификатор продукта = "*" Name= "Кое-что" Язык = "1033" Версия = "1.0.0.0" Производитель = "Кто-то" UpgradeCode = "43ab28d7-6681-4a05-a6b5-f980733aeeed"

Идентификатор продукта должен быть установлен в *, так что каждый раз, когда вы создаете проект, он принимает разные идентификаторы.

  1. Настройте тег MajorUpgrade внутри вашего элемента Package, который выглядит так:

    MajorUpgrade AllowDowngrades = "no" DowngradeErrorMessage = "Более новая версия [ProductName] уже установлена." AllowSameVersionUpgrades = "yes" /

Итак, каждый раз, когда вы обновляете свою версию (или ваша версия такая же, не меньше текущей версии), она переустанавливает ваш продукт, удаляя предыдущие файлы и устанавливая файлы продуктов. Он будет не понижать ваш продукт.

Ответ 5

Просто поместите этот элемент под элементом Product:

<MajorUpgrade AllowDowngrades="yes" />

Дополнительная информация в this HowTo