wix 生成新的升级代码

Posted

技术标签:

【中文标题】wix 生成新的升级代码【英文标题】:wix generating new upgrade code 【发布时间】:2014-05-07 21:43:51 【问题描述】:

我的项目需要能够同时安装 2 个或更多版本。 据我所知,我找到的解决方案是更改每个版本的安装程序的升级代码。

但是我想自动执行此操作。在常规 GUID 中,我只使用“*”,但这不适用于升级代码。 有没有办法在每个 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" xmlns:bal="http://schemas.microsoft.com/wix/BalExtension" xmlns:netfx="http://schemas.microsoft.com/wix/NetFxExtension">
  <Bundle Name="Prog" Version="1.2.1.16" Manufacturer="Gilad Corporation" UpgradeCode="7E71F945-BA46-4872-A6B2-AF992FFDF2D0">
    <BootstrapperApplicationRef Id="WixStandardBootstrapperApplication.RtfLicense">
      <bal:WixStandardBootstrapperApplication LicenseFile="..\SetupProject\Gilad.rtf" />
    </BootstrapperApplicationRef>
    <Chain>
      <!-- TODO: Define the list of chained packages. -->
      <PackageGroupRef Id="Netfx45FullPackage" />
    </Chain>
  </Bundle>

【问题讨论】:

定义产品唯一性的是 ProductCode,而不是 UpgradeCode。 如果你能描述为什么你需要多个实例就好了。通过改变应用程序设计可能有更好的方法来实现这一点。 @Glytzhkof 我有一个应用程序,我可以在其中创建错误修复和不同的新功能。因为我的用户需要能够在 2 个不同的版本上工作,所以我不希望他们只是升级。我希望他们能够并排安装 2 个或更多版本。 为此我要做的是创建一个发布版本和一个 QA 版本的设置,它们可以在同一台机器上共存。在我看来,使用实例很快就会失控。 【参考方案1】:

只是为了回答“如何自动生成UpgradeCode”的问题,如果你使用的是msbuild,你可以在你的项目中做这样的事情:

<PropertyGroup>
  <NewUpgradeCode>$([System.Guid]::NewGuid())</NewUpgradeCode>
</PropertyGroup>

<DefineConstants>NewUpgradeCode=$(NewUpgradeCode)</DefineConstants>

并在捆绑包中:

<Bundle Name="!(bind.PackageName.Package)"
        Version="!(bind.PackageVersion.Package)"
        Manufacturer="!(bind.PackageManufacturer.Package)"
        UpgradeCode="$(var.NewUpgradeCode)">

我实际上是在一个类似模板的包中使用它来打包一些一次性包,我不希望它们相互关联。但是,我仍然希望他们有升级代码,以防我以后需要升级它们。

我不能说这是否是该用例的最佳解决方案,但似乎可行。

【讨论】:

我成功地使用了这个,但我不确定我理解我做了什么。您可以在 wixproj 文件(此处为 NewUpgradeCode)中使用自定义节点吗?而 [System.Guid]::NewGuid() 是一个 powershell 命令? 我不会说这是一个 powershell 命令,因为不会调用 powershell,但是 MSBuild 能够像 powershell 一样调用 .NET 类,并使用类似的语法。它所做的一切都是生成一个随机 guid 并将其作为 WixVariable 传递。【参考方案2】:

我不能 100% 确定您是要交付应用程序的不同版本/语言版本,还是要并排安装多次相同的设置。听起来你想实现后者。让我试着简要解释一下这两种情况。

首先是基础知识:

包代码:标识唯一的 MSI 文件(因此每次重新编译时都应该更改) 产品代码:标识唯一的产品版本。同一产品的不同口味(例如英文版、德文版、法文版)往往具有不同的产品代码。 升级代码:标识一系列相关产品。本质上是一组产品代码。

不同的应用程序版本/语言: 如果您想要安装不同语言版本的设置 - 假设您提供英语、法语和德语版本,您可以通过保持所有升级代码相同来做到这一点,但使用不同的产品代码和包代码每个设置。这允许每个安装程序在机器上已经存在的情况下轻松卸载另一个安装程序。

Side-By-Side 安装:我不喜欢这个概念,因为我认为它往往表明设置设计中存在错误,但“实例转换”的概念应该能够实现你可能指的。

<InstanceTransforms Property="INSTANCEID">
   <Instance Id="Install2" ProductCode="*" 
             UpgradeCode="guid-goes-here" ProductName="Product" />
</InstanceTransforms>
Wix Documentation - Instance Element Authoring Multiple Instances with Instance Transforms Installing Multiple Instances with Instance Transforms A walkthrough in WIX (untested by me) How do Windows Installer instance transforms interact with upgrades? MSI/WiX - Assigning Component GUID's during Multiple Instance Transforms

【讨论】:

我想解释一下为什么这是我的设计。我有一个带有算法的应用程序。该算法进入硬件。所以如果我想要一个向后兼容的选项。因此,如果我安装了该应用程序,并且 2 个月后我想并排安装新版本和旧版本,我将可以选择。【参考方案3】:

小心你想要达到的目标。您是否尝试安装同一软件的多个实例?或者您是否有该程序的不同应用程序可能需要安装到同一台机器上。

MSI 不允许并行安装相同的软件。

正如@Glytzokof 所提到的,您需要处理 MSI 中的三个独立代码。

通常您会生成一个升级代码,该代码永远不会随着您的 MSI 生命周期而改变。如果您尝试安装具有相同升级代码的 MSI 的两个版本,那么您将触发 MSI 中的升级逻辑(即升级现有安装或防止回滚,除非您明确启用此功能)

您要达到的目标需要所有软件包的唯一产品、软件包和升级代码(以允许并行安装软件的 V1 和 V2)但是您需要非常小心选择允许并排。我见过 1.2.x 具有相同升级代码的版本控制,但 1.3.x 具有允许并行安装的新升级代码。

听起来你是来找乐子的。

【讨论】:

以上是关于wix 生成新的升级代码的主要内容,如果未能解决你的问题,请参考以下文章

卸载升级时如何摆脱wix中未使用的dll

升级具有主要版本零的WiX生成的包

WiX“重大升级”不会在降级时完全安装应用程序

如何防止 wix 自定义引导程序卸载 UI 在升级过程中显示

如何在升级过程中运行捆绑包时,如何在WIX(Windows安装程序xml)引导程序项目中将按钮文本更改为“升级”?

WiX创建了msi文件,奇怪的主要升级行为