我想安装一个软件的多个实例。我有多个不同版本的MSI。但是,那些msi的Package Code是相同的。我要安装第二个实例时,弹出错误消息“已经安装了该产品的另一个版本。”
我可以使用msiexec命令安装多个实例。我尝试使用TRANSFORM,但失败了。我可以手动为实例分配软件包代码。如果是,该怎么办?
谢谢。
答案 0 :(得分:2)
旧经典 :Virtualize, seriously。
打包代码 :每个MSI文件的打包代码必须唯一。
“ 我想安装一个软件的多个实例。我有多个 不同版本的MSI。但是,这些msi的包装代码 都一样。“
这是一个错误。程序包代码是MSI文件的唯一标识符。 If two MSI files have the same package code they are by definition the same file as far as Windows Installer is concerned
-如果文件确实不同(并且不仅是同一文件的副本),还会导致非常奇怪的问题。
也许您指的是不同的产品代码。这确实是可能的,并且可以指示同一产品的不同版本(不同版本,不同语言,不同版本等)。在这种情况下,他们通常共享相同的升级代码-这是一个标识相关产品系列的代码。
摘要 :
多个MSI安装实例 :Windows Installer配备不足,无法多次处理同一产品的安装。整个范例假设一个安装实例-围绕组件规则及其引用计数(基于单个绝对安装路径as explained in this answer)。有一些内置的构造,例如“ 实例转换”,但是对我来说,它们似乎像“事后思考”,它们被添加以支持需要大量设计更改才能真正起作用的东西。必须经常更改整个应用程序,以便能够和平共存于不同版本中。
旧版Setup.exe :有时人们诉诸legacy setup.exe installers轻松支持多用户安装。 NSIS,Inno, Installshield旧项目等...不是理想的选择,但是它确实提供了相对容易的多次安装。
优点和缺点 :请快速提醒一下MSI's best features,common problems和一些design challenges(朝下) )。
虚拟化 :虚拟化可能是实现所需功能的最简单方法?您可以在不同的虚拟机中运行不同的应用程序版本,也可以使用虚拟化包-例如Microsoft App-V(application streaming - JIT delivery - no local installation per-se
,can run incompatible software side-by-side
,updating through server
,licensing benefits?
)。然后,将应用程序版本之间的冲突“沙盒化”。我不得不说,这不是我最喜欢的概念,但是它适用于许多领域,并且在现实世界中有很多地方。
实例转换 :内置的MSI概念是多实例转换。请调查MSINEWINSTANCE property并阅读MSI SDK主题:“ Installing Multiple Instances of Products and Patches”。而here is perhaps a better example-更注重实际。我完全避免了这个概念。我相信它可以工作-进行一些计划和应用程序更改。为什么不使用实例转换? There are some issue - as described by Carolyn Napier here(不确定目前是否已解决此特定问题)。总的来说,我发现这个概念并不吸引人-如果需要并行的MSI,我将自己“手动”实现“ 肘部润滑方式”(见下文)。
现在,the two cents from a (natural-born) Virtualizer。
过去的经验 :我之前写过关于多实例安装的主题: I want to install an MSI twice(来自serverfault.com-系统站点 管理员)。
按边设计MSI并排设置 :可以进行MSI设置,使其始终并排安装-无需使用实例转换。本质上,您需要自己进行所有并排准备,并且互相之间不要干涉。 This generally requires major design changes to the application and discipline from the product managers to a degree that is rarely seen
。 COM服务器通常必须基于清单,并且不涉及注册表。 文件关联不得共享。 共享文件必须完全兼容版本或作为并行程序集安装。 MSI组件GUID必须是自动生成的(WiX has features for this: auto component GUIDs),并且每个版本的安装目录必须唯一-可能只是在安装路径中包含版本号。您需要为每个并行流或分支分别不同的升级代码。等等...清单继续。另一种选择是将共享组件放在单独的MSI中,该MSI作为先决条件安装并以其自己的发布周期维护。兼容性问题是可能的。明显。并行程序集可能会起作用,但它们也不是没有漏洞(发布者策略文件可能会被意外删除-破坏了重定向过程)。需要大量的先见之明和肘部润滑脂,但绝对可以带来好处。例如,成功并排安装了产品的UAT和PROD版本。
某些链接 :