如何获取Wix更新程序的先前安装版本


69

我用Wix编写了一个安装程序,可以很好地安装我的程序。现在我需要更新它,所以我增加了版本号,但是当我在旧版本上安装新程序时,它抱怨说已经安装了旧版本,并告诉我先将其卸载。

如何在重新安装之前获取更新或自动卸载它?

Answers:


99

我觉得所提供的答案都不是完整的或独立的,因此在摸索了整个沼泽之后,我认为这是实现更新(完全不言而喻)要求所必需的步骤:

  1. 确保每次构建时您的产品ID都会更改。如果不这样做,您将始终收到OP提及的“已安装”消息。

    <Product Id="*" ...>
    
  2. 每次产品本身更改时,请更改产品版本。我想最好的选择是将其绑定到程序集版本(也应自动递增),但是当然您也可以手动更改它。如果您在第4点使用AllowSameVersionUpgrades属性,则并非严格要求执行此步骤,但是我敢说,在任何情况下,保持产品版本恒定都是不好的做法。

    <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.71.0.0.8。而不仅仅是从1.0.7.01.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>

<产品版本=“!(bind.FileVersion.MyAssemblyDll)” ...>不存在,请咨询。我在VS 2013中使用了wix 3.8。我认为.wxs文件的结构在那里有所不同
Kushan Randima

不知道“不在那里”是什么意思。但是,您是否定义了文件(请参见带有<File Id =“ MyAssemblyDll” ...>的片段)?
Mike Fuchs


1
@KoenVanLooveren:您需要用自己的项目特定信息替换MyAssemblyDll及其路径(在我的示例中,001_MyApplication.MyAssembly将是同一解决方案中的项目名称)。请注意,这仅是如何继续增加版本(将其绑定到可以自动增加的程序集的版本)的建议。要进行测试,您也可以忽略所有这些并编写<Product Version="1.0.0.0" ...>。请再次阅读第2节,并查看wix变量
Mike Fuchs

2
最后有人真正解释了WIX的工作原理。该文档完全失败。更改产品ID以*适合我的情况。
QuantumHive

39

我检查了上面提到的所有帖子,仍然花了很长时间尝试使它起作用。

步骤3中有关官方HOWTO升级提示很有帮助:您需要使用新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>

另请注意,显然,仅使用版本号的前三个组件来检查升级...


1
对于那些新的变量(即$(var.property)语法);wix.sourceforge.net/manual-wix2/preprocessor.htm
Patrick

呵呵,这就是我进行安装的确切方法。然后,我注意到我每次安装都在“控制面板程序”中找到了一个项目。我尝试使用固定的产品ID,从而导致我搜索了此答案。结合Randy Eppinger的注释(必须至少增加版本的第3位数字),您将两全其美。
约翰·霍文

请注意,如果您有多个项目文件(.wxs)文件,则此解决方案将不起作用。Wix工具(浅色)将抱怨重复的升级代码(GUID)。我使用“ MajorUpgrade”解决了这个问题
Jayee '16

8

您需要使用升级表:

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

这是一个教程



1
谢谢,我更正了那个断链。
2014年

感谢您修复此necroposter的链接:-)
Martin Capodici

3

我尝试了这个,对我有用。

  1. 像这样放置您的产品标签:

    产品ID =“ =” Name =“ Something” Language =“ 1033” Version =“ 1.0.0.0” Manufacturer =“ Someone” UpgradeCode =“ 43ab28d7-6681-4a05-a6b5-f980733aeeed”

产品ID应该设置为*,以便每次构建项目时都使用不同的ID。

  1. 在您的Package元素内嵌套MajorUpgrade标签,如下所示:

    “ MajorUpgrade AllowDowngrades =”否“ DowngradeErrorMessage =”已经安装了[ProductName]的较新版本。AllowSameVersionUpgrades =“ yes” /

因此,每次更新版本(或版本相同,但不小于当前版本)时,它都会通过删除以前的文件并安装产品文件来重新安装产品。它不会降级您的产品。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.