我有一个特殊的愿望,希望在一台机器上安装两次 msi。双重安装的目的是先安装在 pre-production 文件夹下,在安全的环境中运行部署,然后再部署到生产文件夹中。
我们通常使用单独的机器来表示这些不同的环境,但是在这种情况下,我需要使用同一个框。
我得到的两种情况如下:
- 我已经安装了预生产,我很高兴,我想安装生产,我运行 msi,它询问我是否要修复或删除安装
- 我已经安装了生产,我想安装新版本的 msi,它告诉我已经安装了一个版本的产品,我必须先卸载当前版本
第一种情况还不错,因为我们可以在生产文件夹下明智地卸载并重新安装,但第二种情况很痛苦,因为我们不想卸载实时生产部署。
我可以给 msiexec 一个允许这样做的设置吗?
我可以使用更合适的不同方法吗?
虚拟化,认真
不可能两次安装完全相同的 MSI。您可能能够打开 MSI 并更改 GUID 以使其再次安装。请注意,这样会有龙。除非您非常幸运或安装/产品非常简单,否则我几乎可以保证您的第二次安装不仅无法正常工作,而且您很可能也会破坏第一次安装。我强烈建议您解决任何让您认为有必要使用一个盒子的问题。
看看 Scott Willeke 的 Less Msiérables (LessMSI) 能为您做什么......
http://lessmsi.activescott.com/
使用它来提取和更改 MSI 的 guid 和/或内容,重新打包并执行您的“安装两次”需求。
Windows Installer 有一个内置功能,它应该允许你做你想做的事情:“实例转换”,但尽管我有所有的 MSI 经验,但我并没有太多使用它。它允许您通过 MSINEWINSTANCE 属性和命令行中的转换集多次安装相同的产品。
如果这是第三方应用程序,我会选择已经推荐的虚拟化方法。您应该知道,您可以使用Microsoft App-V 虚拟程序包或仅使用常规VMWare或虚拟 PC实现(虚拟 PC 与虚拟程序包相对)来虚拟化程序包。
与普通应用程序相比, Microsoft App-V 虚拟包和新的虚拟化技术允许一些新功能:
如果这是一个内部应用程序,您可以在其中与开发团队进行对话,一个可行的解决方案是构建第二个开发 MSI,将预发布版本与生产版本并排安装。然后,这些 MSI 文件将需要被创作,以便能够以文明的方式共存。这实际上涉及很多事情 - 并且涉及诸如不争夺相同的文件关联,不从不同位置注册系统范围的 COM 组件,不覆盖彼此的注册表项,不使用相同的快捷方式,不覆盖彼此的设置文件(文本、xml、ini 等)。有很多挑战。
最后,以及我们通常选择的方法,我们可以让 MSI 根据传递给它的参数安装不同的配置。因此,您可以拥有一个名为CUSTOM_ENVIRONMENT = "DEV"的属性来安装应用程序的测试实例。这种方法依赖于一个能够以不同风格安装自身的 MSI - 但是 - 因此似乎与您的要求不匹配。
总而言之(按照我的主观偏好):
一些链接:
阻止您安装两次的是 ProductCode Guid,如果您更改它将删除“此产品已安装”消息并让您安装。这就是实例转换正在做的事情,但您可以通过在 Orca 中打开它并更改属性表中的产品代码来做同样的事情。
显然,即使您确实破解了它以安装两次,您也希望确保您没有在相同的位置覆盖。