Как заставить Wix обновить ранее установленную версию программы - PullRequest
64 голосов
/ 01 февраля 2009

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

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

Ответы [ 5 ]

86 голосов
/ 13 октября 2014

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

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

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

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

    <Product UpgradeCode="f4d7f199-28f6-45d5-ad99-7c62938274be" ...>
    
  4. Добавьте элемент 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's 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>
38 голосов
/ 05 января 2010

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

Подсказка в официальном HOWTO для обновлений на шаге 3 очень помогла: вам нужен новый Product/@Id, чтобы отключить сообщение "Другая версия этого продукта уже установлена ».

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

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

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

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

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

7 голосов
/ 01 февраля 2009

Вам необходимо использовать таблицу обновлений:

<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>

Вот учебник

3 голосов
/ 20 апреля 2017

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

  1. Поместите ваш тег продукта так:

    Product Id = "*" Name = "Something" Language = "1033" Version = "1.0.0.0" Manufacturer = "Someone" UpgradeCode = "43ab28d7-6681-4a05-a6b5-f980733aeeed"

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

  1. Вложите тег MajorUpgrade в элемент Package, который выглядит следующим образом:

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

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

0 голосов
/ 21 марта 2014

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

<MajorUpgrade AllowDowngrades="yes" />

Больше информации в этом HowTo

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