基本上,我正在尝试升级我的应用程序,据我所知,以下内容应该无条件地重新安装所有组件: msiexec /i myapp.msi REINSTALL=ALL REINSTALLMODE=vamus
但是,在详细日志中我看到: MSI (s) (A0:60) 15:40:10:948: Component: A;Installed: Local;Request: Null;Action: Null
MSI (s) (A0:60) 15:40:10:948:组件: B;安装:本地;请求:空;操作:空
MSI (s) (A0:60) 15:40:10:948:组件: C;已安装:本地;请求:空;操作:空
MSI (s) (A0:60) 15:40:10:948:组件: D;已安装:本地;请求:空;操作:空
对于每个组件都是如此。如果我从目标文件夹中删除或重命名一个文件,它将正确安装新版本,但是如果该文件存在于该位置,它将忽略它,而不是用当前msi文件中的副本替换它。
有没有人知道可能出了什么问题?
编辑:安装程序是在WiX中创建的。产品ID和UpgradeCode保持不变,而PackageID设置为*,因此应该为每个构建生成一个新的ID,因此据我所知,这应该是正确的
发布于 2009-02-12 23:31:42
这有点棘手,我也遇到过同样的问题。要使更新安装正常工作,更新包必须包含来自原始包的所有组件。这意味着您永远不能删除组件。您可以从组件中删除文件,甚至可以删除所有文件,但不允许删除组件。否则,在安装补丁或进行次要更新时,更新安装实际上不会做任何事情。ComponentID存储在Windows注册表中,Windows Installer服务使用它们检查系统上是否安装了组件。
如果删除了组件,该怎么办?您可以尝试重新添加它们,但它们具有相同的包is,这是困难甚至不可能的部分。
如果它仍然不能工作,你必须选择一个新的安装,并必须自己弄清楚哪些必须更新。
或者,您也可以进行重大更新,先卸载,然后再进行安装。Windows Installer不会以这种方式关心Feature-Componenent结构。
发布于 2011-06-16 21:40:53
Windows installer将积极防止将二进制文件降级到难以完成的程度,即使使用“纯粹的强制”,就像您对REINSTALLMODE=amus所做的那样。这是微软策略的一部分,目的是防止Windows早期存在的"DLL地狱“。在那些日子里,用旧版本覆盖系统DLL文件是可能的,因此破坏了左,右和所有地方。Windows Installer有几层保护以防止二进制文件降级。
在您需要能够像您提到的那样降级文件的情况下,真正有效的唯一方法是使用主要升级。主要的升级并不是真正的升级,而是卸载并重新安装相关产品。这使您可以避免使MSI次要升级正常工作所涉及的许多复杂性。
即使是关于降级的重大升级也是复杂的。您必须在InstallExecuteSequence的早期对现有产品的卸载进行排序,以便在Windows Installer在文件成本计算期间对系统进行过多分析之前将旧产品从系统中删除。此操作将系统状态与MSI中的文件进行比较,并确定需要(重新)安装哪些文件。如果版本逻辑表明MSI中的文件是降级的,那么最终结果可能是删除磁盘上的文件,并且根本不安装较旧的文件。可能有必要通过自定义操作将文件提前从磁盘中删除,以确保降级的可靠性,或者使用目标目标文件夹的绝对路径在不同版本之间不同的安装文件夹。这将欺骗MSI“文件成本计算”,使其看不到安装在同一位置的文件:
%ProgramFiles%\My Company\My Product\1%ProgramFiles%\My Company\My Product\1.1
我不喜欢这个“移动目标”安装文件夹--在我看来,这不是MSI文件的安装方式,但它可以解决你的问题。
发布于 2009-02-12 23:18:44
您是否更新了版本号并配置了升级?
https://stackoverflow.com/questions/543505
复制相似问题