【问题标题】:Patching an installation using a bundle oder msi?使用 bundle oder msi 修补安装?
【发布时间】:2017-04-10 17:15:29
【问题描述】:

我没有修补/升级安装的经验。

我们有一个 wix 包设置,其中包含一个标准(wix 创建的)msi,以这种方式添加到包中:

<MsiPackage SourceFile="MySetup.msi" Id="MySetupId" Cache="yes" DisplayInternalUI="no" SuppressSignatureVerification ="yes" Visible="no" >

所以在添加/删除软件部分显示的是捆绑包,而不是 msi 本身。

msi 和捆绑包都已签名。

目前我们发布的版本是“2.1.0.BuildNumber”。

bundle.wxs 有升级代码 A msi有产品代码B和升级代码C。

不幸的是,这个版本包含一个普通的错误,但我们不想仅仅因为这个错误而发布“v2.2.0.BuildNumber”,而是“2.1.1.BuildNumber”,所以我们需要一个补丁。

这里的最佳做法是什么?我们是否应该只创建一个像这里描述的 msp 文件

http://wixtoolset.org/documentation/manual/v3/patching/wix_patching.html?

这会破坏 bundle 和 msi 之间的关系吗?这个补丁会显示在添加/删除程序部分吗?

或者是否有可能将捆绑包用于补丁?

目标是,我们的客户无需卸载旧版本即可安装补丁,但可以使用以前发布的捆绑包卸载整个范围。

【问题讨论】:

  • 您创建补丁而不是常规软件包的动机是什么?在 CD/DVD 和缓慢的互联网时代,其动机是补丁只包含更改并且比主包小得多。您的产品是否仍然存在问题?
  • 另一个动机是软件包版本保持不变。但是你建议改一下:主包2.2.0,新包2.2.1是新的包版本,可以作为新版本的包安装,而不是补丁。
  • 最后,如果用户可以从 ARP 卸载当前安装的版本或使用最新的、当前安装的安装包,“可以使用以前发布的捆绑包进行卸载”有些人为。
  • 我们的安装包含几个包,如 html 文件和一些保持不变的 zip。这就是为什么我们只想部署我们更改的二进制文件,基本上是一些 dll。版本号的增加不是强制性的,但现在我们的产品版本与我们的二进制文件的构建版本相同。我想我不明白你的最后一点。在 ARP 中,现在只有捆绑包,而不是真正安装的 msi 可见。因此,当补丁被应用时,删除整个文件的唯一方法是使用包的 ARP 条目或 bundle.exe。

标签: installation wix windows-installer bundle patch


【解决方案1】:

我的个人建议是,除非绝对必要,否则不要创建补丁。你避免了很多麻烦。 IMO 的主要问题是补丁不能很好地适应源代码控制和 CI。首先,您无法自动增加内部版本号并将其包含在版本号中 - 它必须保持不变。其次,创建 msp 补丁要求在新构建期间存在来自先前构建的二进制文件。在 MS 技术中,应该存在以前的 msi,在您引用的 WiX 技术中,您将需要以前版本中的 *.wixpdb。第三(还是第一个?),补丁是一次性操作,不应该由 CI 自动执行连续执行。

如果捆绑包没有将其包包含在 exe 中而是下载它们,则新的捆绑包版本只能下载更改的包,因此安装时间会很短。否则你就不走运了。

您需要为您的错误 msi 创建一个 msp 升级。升级可能会或可能不会更改 msi 版本,但如果更改,则 msi 的版本将与捆绑包的版本不匹配。用户无论如何都看不到 msi 版本。

你可以直接安装msp。当捆绑包被卸载时,msp 也将被卸载。不知道msp在ARP中是否可见(msi不可见)。

您可以创建一个补丁包。这是一个独立的捆绑包,有自己的升级代码。它将包含

<Bundle .... ParentName="Name of your main bundle"...>
    <RelatedBundle Id="YourMainBundleUpgradeCode" Action="Patch" />

将 MspPackage 与您的 msp 一起包含到链中。

此捆绑包将作为“主捆绑包名称”的子项在已安装更新中可见,并且将与主捆绑包一起卸载或在安装主捆绑包的新版本时卸载。

您还需要包含一个条件,以防止在未安装此特定版本的主包时安装补丁包。没有记录在案的 API 来检测包(尽管您可以使用 RegistrySearch),但您可以对包含在主包中的特定版本的 msi 执行 ProductSearch。

请注意,具有相同版本号的主捆绑包的新版本将并行安装(ARP 中将有两个相同的条目),具有更大版本号的新版本将自动卸载以前的版本。因此,您无法发布主包的新版本。

【讨论】:

  • 不幸的是,我们在包的 c# 代码中做错了。直接应用 MSP 可以正常工作,尽管 ARP 中的捆绑版本不再正确。我们的包中有代码在 PackageState.Superseded 时中止设置,因此我无法使用我们的包卸载应用程序。我试试你的第二个建议。补丁包的升级代码不能与主包相同,对吧? @dvom:“请注意,具有相同版本号的主包的新版本”是指补丁包的相同版本号?我们将防止这种情况发生。
  • 你有另一个反对修补的论点。传统的安装程序智慧说,在您准备和测试 1.1 之前,您的 1.0 安装程序还没有准备好。在您的情况下,准备并测试了一个补丁:(
  • 如果刻录引擎先卸载补丁包,补丁包可能会起作用。希望是这样,我只是不知道。此外,请确保您的 msp 补丁是可卸载的(查看文档)。如果唯一的变化是新的dll版本,应该没问题。
  • 从 APR 卸载补丁包时,它首先删除 msp,然后删除主包,因此至少只需单击一次,这很好。尝试卸载主包时,由于被取代,它仍然显示错误,但这是我们可以接受的。现在我必须弄清楚当相关主包丢失时如何防止补丁包表单安装,-) 谢谢你的帮助,你拯救了我的复活节。
猜你喜欢
  • 2011-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-01
相关资源
最近更新 更多