使用 bundle 或 msi 修补安装?

Patching an installation using a bundle oder msi?

我没有patching/upgrading安装经验。

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

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

所以在 Add/Remove 软件部分显示了捆绑包,而不是 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?

这会破坏捆绑包和 msi 之间的关系吗?这个补丁会显示在 Add/Remove 程序部分吗?

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

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

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

自动连续执行。

如果bundle不包含它的包到exe中而是下载它们,新的bundle版本可以只下载改变的包,这样安装时间会很短。否则你就倒霉了。

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

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

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

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

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

此捆绑包将作为 "Name of your main bundle" 的子捆绑包显示在已安装的更新中,并且将与主捆绑包一起卸载,或者在安装新版本的主捆绑包时卸载。

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

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