使用msiexec和GUID卸载MSI

时间:2015-07-14 17:14:27

标签: visual-studio-2013 deployment windows-installer msiexec octopus-deploy

我一直致力于使用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. 我后来想要部署一个NuGet包,其中包含MSI的更新版本1.1,其中已删除版本1.0中存在的DLL,与上面的项目符号相同的目标环境
  3. 卸载旧版本时,我需要为模板提供我要卸载的MSI的路径。我们假设1.0版在目标环境中不再存在。我可以将模板指向MSI的1.1版,以卸载1.0版本吗?

    据我所知,客户已经为MSI生成了固定的GUID,即每次Visual Studio生成/构建它时,MSI的GUID都是相同的。因此,我想知道 msiexec 是否使用此GUID来卸载MSI,因此,无论我在模板中指向哪个版本的MSI来卸载它都无关紧要。

    这是正确的理解吗?感谢我能得到的任何帮助和澄清。

1 个答案:

答案 0 :(得分:1)

据我所知,部署模板只是一种安装带有一堆参数的MSI的方法,这些参数包括MSI的路径和一些失败的错误消息。

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

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

据我所知,您需要做的就是使用相同的模板来安装每个MSI产品,1.0,1.1等,只要您接受ProductCode的更改,只需将其增加为墙,只需安装即可新的并同时卸载旧的。