wix生成新的升级代码

时间:2014-05-07 21:43:51

标签: wix wix3.5 wix3.6 wix3.7

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

然而我想自动这样做。在常规GUID中我只使用“*”但这不适用于upgradecode。 有没有办法在每个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>

3 个答案:

答案 0 :(得分:4)

如果您想提供应用程序的不同版本/语言版本,或者您想要并排安装相同的设置,我不是100%确定。听起来你想要实现后者。让我试着简要解释两种情况。

首先是基础:

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

不同的应用程序版本/语言: 如果你想要的是安装一个不同语言版本的设置 - 比如你提供英语,法语和德语版本,你可以通过保持所有这些版本的升级代码相同,但使用不同的产品代码和包代码来实现每个设置。如果计算机上已存在另一个设置,则允许每个设置轻松卸载另一个设置。

并排安装:我不喜欢这个概念,因为在我看来,它往往表明设置设计中存在错误,但“实例转换”的概念应该能够实现你可能会提到的。

<InstanceTransforms Property="INSTANCEID">
   <Instance Id="Install2" ProductCode="*" 
             UpgradeCode="guid-goes-here" ProductName="Product" />
</InstanceTransforms>

答案 1 :(得分:4)

回答“如何自动生成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)">

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

我不能说这是否是这个用例的最佳解决方案,但似乎有效。

答案 2 :(得分:1)

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

MSI并非旨在允许并排安装相同的软件。

正如@Glytzhokof所提到的,MSI中有三个独立的代码需要解决。

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

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

听起来像是为了一些乐趣。