使用 msiexec 和 GUID 卸载 MSI

Uninstalling an MSI using msiexec and GUID

我一直致力于为使用 Octopus Deploy 的客户设置部署管道。客户正在从 Visual Studio 2013 解决方案构建 MSI(遗憾的是,通过使用旧的 .vdproj,但这是另一回事)。我正在使用 OctoPack 将 MSI 包装在 NuGet 包中,并使用 NuGet.exe.

将其发布到 Octopus 内部 NuGet 存储库

然后我使用 Octopus 中的 "Deploy NuGet package" 步骤将包部署到给定环境。现在,作为部署过程的一部分,我还使用 template from the Octopus Deploy Libray 安装了 MSI。该模板还使我能够先从目标机器上卸载 MSI(如果已安装),这将是部署过程中自然而然的第 2 步。它使用 msiexec 在 MSI 上执行操作。这就是我的问题所在。考虑以下情况:

  1. 我将包含 MSI 1.0 版的 NuGet 包部署到目标环境
  2. 稍后我想将包含 MSI 更新版本 1.1 的 NuGet 包部署到与上述项目符号相同的目标环境,其中删除了版本 1.0 中存在的 DLL

卸载旧版本时,我需要为模板提供我要卸载的 MSI 的路径。假设目标环境中不再存在 1.0 版。我可以将模板指向 MSI 的 1.1 版,以卸载 1.0 版吗?

据我从客户那里了解到,已经为MSI生成了一个固定的GUID,即每次Visual Studio produces/builds MSI的GUID都是相同的。因此,我想知道 msiexec 是否使用此 GUID 来卸载 MSI,因此,我在模板中指向哪个版本的 MSI 来卸载它并不重要。

这样理解正确吗?感谢我能得到的任何帮助和说明。

据我所知,部署模板只是一种安装 MSI 的方法,其中包含一系列参数,包括 MSI 的路径和一些失败时的错误消息。

卸载 MSI 文件不需要路径。您只需要 ProductCode(一个 guid)并使用 msiexec /x {ProductCode}

但是....当您增加 MSI 安装项目的 ProductVersion 时,它会提示您更改 ProductCode 等。如果您接受此设置并将 RemovePreviousVersions 属性 设置为 True,您将进行升级是全新安装,但如果旧产品已安装,它也会卸载旧产品。因此,如果您这样做,您甚至不需要卸载旧产品,因为安装新产品就可以了。

据我所知,您需要做的就是使用相同的模板来安装每个 MSI 产品,1.0、1.1 等,只要您接受 ProductCode 的更改,您总是会递增它安装新的,同时卸载旧的。