Обновление до более новой версии с использованием WIX Installer не копирует новые файлы - PullRequest
0 голосов
/ 03 марта 2020

Я пытаюсь обновить уже установленный пакет MSI с V1 до V2. Пакет MSI является частью пакета (у нас есть 10 различных пакетов MSI в пакете, но только этот вызывает проблемы с обновлением).

Проблема, с которой я столкнулся, заключается в том, что после обновления новая версия выглядит корректно в Control Панель, но когда я go на диск, новые файлы не копируются, и я остаюсь со старыми файлами на диске (файлы V1). Если я выполняю восстановление из панели управления, новые файлы копируются с правильной версией.

Я использую WixSharp версии 1.4.4.1.

Кто-нибудь знает, почему обновление не выполняется должным образом?

Пример того, как выглядит Bundle.wxs, можно найти ниже:

    <Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
      xmlns:netfx="http://schemas.microsoft.com/wix/NetFxExtension"
      xmlns:util="http://schemas.microsoft.com/wix/UtilExtension"
      xmlns:bal="http://schemas.microsoft.com/wix/BalExtension">
     <Bundle Name="Test.Installer"
          Version="!(bind.packageVersion.Test_Package_msi)"
          Manufacturer="Test"
          UpgradeCode="bdbd5b31-e749-455d-9fea-cd81f3297ca1"    >

    <BootstrapperApplicationRef Id ="ManagedBootstrapperApplicationHost" >
      <PayloadGroupRef Id ="InstallerPayload" />
    </BootstrapperApplicationRef>
    <Chain>
      <PackageGroupRef Id ="NetFx472Redist" />
      <PackageGroupRef Id ="InstallerPackages" />
    </Chain>
  </Bundle>
        <?define NetFx472MinVersion = 4703062 ?>
        <?define NetFx472EulaLink = https://referencesource.microsoft.com/license.html ?>
        <?define NetFx472RedistLink = https://go.microsoft.com/fwlink/?linkid=863265 ?>

     <Fragment>
    <WixVariable Id="WixMbaPrereqPackageId" Value="NetFx472Redist" />
    <WixVariable Id="WixMbaPrereqLicenseUrl" Value="$(var.NetFx472EulaLink)" Overridable="yes" />
    <WixVariable Id="NetFx472RedistCondition" Value="Netfx4FullVersion &gt;= $(var.NetFx472MinVersion)" Overridable="yes" />
    <WixVariable Id="NetFx472RedistPackageDirectory" Value="Redist\NETFX472\" Overridable="yes" />

       <util:RegistrySearch
       Root="HKLM"
       Key="SOFTWARE\Microsoft\Net Framework Setup\NDP\v4\Full"
       Value="Version"
       Variable="Netfx4FullVersion" />

    <PackageGroup Id="NetFx472Redist">
      <ExePackage
          DisplayName="Microsoft .NET Framework 4.7.2"
          InstallCommand="/q /norestart /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx472FullLog].html&quot;"
          RepairCommand="/q /norestart /repair /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx472FullLog].html&quot;"
          UninstallCommand="/uninstall /q /norestart /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx472FullLog].html&quot;"
          PerMachine="yes"
          DetectCondition="!(wix.NetFx472RedistCondition)"
          InstallCondition="NOT !(wix.NetFx472RedistCondition)"
          DownloadUrl="$(var.NetFx472RedistLink)"
          Id="NetFx472Redist"
          Vital="yes"
          Permanent="yes"
          Protocol="netfx4"
          Compressed="yes"
          SourceFile="..\Redist\NETFX472\NDP472-KB4054530-x86-x64-AllOS-ENU.exe"
          Name="!(wix.NetFx472RedistPackageDirectory)NDP472-KB4054530-x86-x64-AllOS-ENU.exe"
        >
      </ExePackage>
    </PackageGroup>
  </Fragment>

  <Fragment>
    <PayloadGroup Id ="InstallerPayload">
      <Payload SourceFile = "$(var.SolutionDir)\Libraries\Microsoft.Deployment.WindowsInstaller.dll" />
      <Payload SourceFile = "$(var.SolutionDir)\Libraries\GalaSoft.MvvmLight.dll"/>
      <Payload SourceFile = "$(var.SolutionDir)\Libraries\GalaSoft.MvvmLight.Extras.dll"/>
      <Payload SourceFile = "$(var.SolutionDir)\Libraries\GalaSoft.MvvmLight.Platform.dll"/>
      <Payload SourceFile = "$(var.SolutionDir)\Libraries\log4net.dll"/>
  </PayloadGroup>
  </Fragment>

  <Fragment>
    <PackageGroup Id ="InstallerPackages">
      <MsiPackage SourceFile="$(var.SolutionDir)\Libraries\MSI\Package1.msi" ForcePerMachine="yes"
          Id="Package1_msi" DisplayName="Package 1" Visible="yes" Cache="yes" DisplayInternalUI="no" Description="23A29233-37FD-4079-92AF-8337998DF4D3">
      </MsiPackage>
    <!-- 10 other packages -->
    </PackageGroup>
  </Fragment>
</Wix>

Проект MSI создается с использованием следующих строк:

   var project = new ManagedProject();
    project.Name = "Test";
    project.Description = "Test Package";
    project.GUID = Guid.Parse("{94682162-F133-40A3-92BB-0AF08142474C}");
    project.ProductId = Guid.Parse("{94682162-F133-40A3-92BB-0AF08142474C}");
    project.Dirs = GetDirectoriesAndFilesToInstall();
    project.Version = GetInstallerVersion();
    project.BannerImage = "Banner.bmp";

    project.Actions = new WixSharp.Action[]
    {
        new ElevatedManagedAction(CustomActions.UninstallService, Return.check, When.After, Step.InstallInitialize, Condition.Always),
        new ElevatedManagedAction(CustomActions.InstallService, Return.check, When.After, Step.InstallExecute, Condition.Always),
    };

    project.BuildMsi(msiPath);

1 Ответ

0 голосов
/ 05 марта 2020

Я обнаружил проблему: обновление работает, только если вы добавляете файлы во время обновления, а не если вы удаляете файлы.

Я сравнил старую установку с новой, и 6 новых файлов отсутствовали в новой. , Из-за этого обновление вообще не обновляло никаких файлов.

Статья, которая вдохновила меня, может быть найдена здесь: Правила установщика MSI

Я понял, что сломался Правило 2. Только добавляйте, никогда не удаляйте ресурсы из компонента

Это как-то странно, что если я захочу удалить файлы во время обновления? Какие решения у меня есть?

ОБНОВЛЕНИЕ: Я обнаружил, что MajorUpgrade можно принудительно ввести в код, как показано ниже:

var project = new ManagedProject
        {
            Name = "Your name",
            Description = "Your description",
            GUID = Guid.Parse("{94682162-F133-40A3-92BB-0AF08142474C}"),
            MajorUpgrade = new MajorUpgrade
            {
                DowngradeErrorMessage = $"A later version of {projectName} is already installed. Setup will now exit."
            },
            Actions = new WixSharp.Action[]
            {
                new ElevatedManagedAction(CustomActions.UninstallService, Return.check, When.After, Step.InstallInitialize, Condition.Always),
                new ElevatedManagedAction(CustomActions.InstallService, Return.check, When.After, Step.InstallExecute, Condition.Always),
            }
        };

и вам не нужно менять основную часть в сборочная версия. Например, если в существующем установщике была установлена ​​версия 1.1.0.0, вы можете принудительно выполнить обновление в коде, но измените версию на 1.2.0.0 вместо изменения на 2.0.0.0.

Кроме того, в установщике Пакетный проект мне пришлось добавить это свойство: EnableFeatureSelection = "yes" для каждого элемента MSIPackage. Это свойство позволяет вам перехватить событие с именем: DetectRelatedMsiPackage. Это поможет вам различать версии и определить, какой пакет установлен или нет, а также какой можно обновить.

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