【问题标题】:Upgrade to a newer version using WIX Installer doesn't copy the new files使用 WIX 安装程序升级到较新版本不会复制新文件
【发布时间】:2020-03-03 16:14:34
【问题描述】:

我正在尝试将已安装的 MSI 软件包从 V1 升级到 V2。 MSI 包是捆绑包的一部分(捆绑包中有 10 个不同的 MSI 包,但只有这一个会导致升级问题)。

我遇到的问题是,升级后新版本在控制面板中显示正确,但是当我转到磁盘时,新文件没有被复制,我只剩下磁盘上的旧文件(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);

【问题讨论】:

  • 您是否尝试添加“new Property("REINSTALLMODE", "amus")" 以强制重新安装文件?
  • 是的,试过了,但什么也没做。旧版本的文件保持不变。

标签: wix windows-installer upgrade


【解决方案1】:

我发现了问题:只有在升级过程中添加文件时升级才有效,删除文件时无效。

我将旧安装与新安装进行了比较,新安装缺少 6 个文件。因此,升级根本没有更新任何文件。

启发我的文章可以在这里找到: MSI Installer Rules

我意识到我违反了规则 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。

此外,在安装程序包项目中,我必须为每个 MSIPackage 元素添加以下属性:EnableFeatureSelection="yes"。此属性使您能够捕获名为:DetectRelatedMsiPackage 的事件。这将帮助您区分版本并确定安装或未安装的软件包以及可以升级的软件包。

【讨论】:

  • 这是小升级的行为。我建议 99% 的 MSI 开发人员转而使用主要升级。你用的是那个 WiXCharp 吗?有趣的概念但对它不感兴趣,因为它隐藏了底层的 WiX 太多。我有一个你可能会觉得有用的开源工具。 github.com/iswix-llc/iswix-tutorials
  • PS- 如果入住 Minor 升级,此属性 MSIENFORCEUPGRADECOMPONENTRULES (docs.microsoft.com/en-us/windows/win32/msi/…) 将帮助您避免这些问题。
  • 嗨@ChristopherPainter,我尝试设置属性和策略,但在升级过程中出现错误提示:“安装包时出错。需要重新启动才能继续安装。”文件保留 V1 文件版本,永远不会增加到 V2 文件版本。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-03
  • 2016-01-15
  • 2012-03-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多