【问题标题】:WiX: Patch installer superseding previous versions (1.0.0 -> 1.0.1, 1.0.0 -> 1.0.2, 1.0.1 -> 1.0.2, aso.)WiX:补丁安装程序取代以前的版本(1.0.0 -> 1.0.1、1.0.0 -> 1.0.2、1.0.1 -> 1.0.2 等)
【发布时间】:2012-03-23 22:39:29
【问题描述】:

我正在尝试提供一个简单的安装程序包 (MSI),我希望通过更新(补丁程序)来支持它,以取代所有以前的补丁程序。所以我有一个 MSI V1.0.0 和 2 个补丁 V1.0.1 和 V1.0.2。用户应该能够只安装最新的补丁,而不管之前的补丁已经应用到系统。我的项目包含 2 个功能(客户端和服务器)。补丁的基础始终是 RTM 包 (HelloWorld 1.0.msi / HelloWorld 1.0.wixpdb)。

所有补丁的生成(构建)都有效,因此更新程序 1.0.0 -> 1.0.1 和 1.0.0 -> 1.0.2 可以,但是当我尝试从 1.0.1 更新到 1.0.2 时补丁失败,并显示以下错误消息:“Windows Installer 服务无法安装升级补丁,因为要升级的程序可能丢失,或者升级补丁可能会更新程序的不同版本。验证要升级的程序升级存在于您的计算机上,并且您拥有正确的升级补丁。”。更糟糕的是,当我在已经安装了 1.0.2 的系统上运行 1.0.1 补丁时,补丁会用旧版本覆盖现有安装!?我完全糊涂了……

我还在网上找到了几篇关于修补的博客文章,但没有一个适用于我的替代方案。

wix 补丁代码 - “patch1.wxs”:

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
  <Patch
      AllowRemoval="yes"
      Manufacturer="My Company"
      MoreInfoURL="http://www.mycompany.com/"
      DisplayName="HelloWorld V1.0 Patch 1"
      Description="Patch intaller updating HelloWorld V1.0.x to V1.0.1"
      Classification="Update">

    <Media Id="32000" Cabinet="HelloWorldRTM.cab">
      <PatchBaseline Id="HelloWorldRTM">
        <Validate ProductId="yes" UpgradeCode="yes" ProductVersionOperator="LesserOrEqual" />
      </PatchBaseline>
    </Media>

    <PatchFamilyRef Id="HelloWorldPatchFamily"/>
  </Patch>

  <Fragment>    
    <PatchFamily Id='HelloWorldPatchFamily' Version='1.0.1.0' Supersede='yes'>
      <PropertyRef Id="ProductVersion"/>
      <ComponentRef Id="HelloWorldServer.dll"/>
    </PatchFamily>
  </Fragment>
</Wix>

补丁 1 构建脚本 - “generate_patch1.bat”:

"%WIX%\bin\torch.exe" -p -xi ".\_Distrb\HelloWorld 1.0.wixpdb" ".\_Distrb\HelloWorld 1.0.1.wixpdb" -out ".\_Build\patch1.wixmst"
"%WIX%\bin\candle.exe" -out ".\_Build\patch1.wixobj" ".\patch1.wxs"
"%WIX%\bin\light.exe" ".\_Build\patch1.wixobj" -out ".\_Build\patch1.wixmsp"
"%WIX%\bin\pyro.exe" ".\_Build\patch1.wixmsp" -out ".\_Distrb\HelloWorld 1.0 Patch1.msp" -t HelloWorldRTM ".\_Build\patch1.wixmst"

wix 补丁代码 - “patch2.wxs”:

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
  <Patch
      AllowRemoval="yes"
      Manufacturer="My Company"
      MoreInfoURL="http://www.mycompany.com/"
      DisplayName="HelloWorld V1.0 Patch 2"
      Description="Patch intaller updating HelloWorld V1.0.x to V1.0.2"
      Classification="Update">

    <Media Id="32000" Cabinet="HelloWorldRTM.cab">
      <PatchBaseline Id="HelloWorldRTM">
        <Validate ProductId="yes" UpgradeCode="yes" ProductVersionOperator="LesserOrEqual" />
      </PatchBaseline>
    </Media>

    <PatchFamilyRef Id="HelloWorldPatchFamily"/>
  </Patch>

  <Fragment>
    <PatchFamily Id='HelloWorldPatchFamily' Version='1.0.2.0' Supersede='yes'>    
      <PropertyRef Id="ProductVersion"/>
      <ComponentRef Id="HelloWorldServer.dll"/>
      <ComponentRef Id="HelloWorld.exe"/>
    </PatchFamily>
  </Fragment>
</Wix>

补丁 2 构建脚本 - “generate_patch2.bat”:

"%WIX%\bin\torch.exe" -p -xi ".\_Distrb\HelloWorld 1.0.wixpdb" ".\_Distrb\HelloWorld 1.0.2.wixpdb" -out ".\_Build\patch2.wixmst"
"%WIX%\bin\candle.exe" -out ".\_Build\patch2.wixobj" ".\patch2.wxs"
"%WIX%\bin\light.exe" ".\_Build\patch2.wixobj" -out ".\_Build\patch2.wixmsp"
"%WIX%\bin\pyro.exe" ".\_Build\patch2.wixmsp" -out ".\_Distrb\HelloWorld 1.0 Patch 2.msp" -t HelloWorldRTM ".\_Build\patch2.wixmst"

【问题讨论】:

  • 补丁创建有两种方式:“使用补丁创建属性”或“使用纯WiX”。在“使用纯 WiX”出现问题之后 - 你使用的方式,我现在使用“使用补丁创建属性”没有问题。链接:wix.sourceforge.net/manual-wix3/patching.htm
  • 你是怎么解决这个问题的?
  • @boli:很遗憾没有。我们解雇了它,现在卸载重新安装整个工作,即使不是那么优雅。 :(+
  • @moik 我解决了这个问题,但我认为它是一个 hack 而不是一个好的解决方案(必须存储安装程序,必须使用管理安装,...)

标签: wix patch msp msi-patch


【解决方案1】:

我遇到了类似的问题,并通过在补丁 wxs.xml 中添加适当的验证来解决它。试试这个...

<Media Id="32000" Cabinet="HelloWorldRTM.cab">
  <PatchBaseline Id="HelloWorldRTM">
    <Validate ProductId="yes" UpgradeCode="yes" ProductVersion="Major" ProductVersionOperator="GreaterOrEqual" />
  </PatchBaseline>
</Media>

如果您不希望补丁在安装的修订号大于补丁的修订号时工作,您可能需要将 ProductVersion 更改为“更新”并将 ProductVersion 设置为“GreaterOrEqual”。

我希望它对你有用!

【讨论】:

    猜你喜欢
    • 2011-01-18
    • 1970-01-01
    • 2016-12-14
    • 1970-01-01
    • 2020-07-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-11
    • 1970-01-01
    相关资源
    最近更新 更多