2011-11-18 67 views
4

我正在为我们的产品开发基于WIX的产品,它具有基本产品和许多插件。 Base和插件将作为独立的MSI发货。插件只能在基础可用时安装。基本和插件在ROOT文件夹(如“C:\ Program files \ MyProduct”)下共享公用文件夹树。使用自定义操作卸载多个产品

我正在使用自定义操作来卸载所有依赖插件。但插件没有正确卸载。这是非常随机的。有时,有三个插件被卸载,有些时候只有两个插件。但我可以从“添加/删除程序”中单独卸载插件。

我使用下面的自定义操作...

<Fragment> 
    <CustomAction Id='UninstallP1Action' Directory='SystemFolder' ExeCommand="[SystemFolder]MSIExec.exe /X {PRODUCT_CODE_HERE} /qn /l* $(env.windir)\Temp\p1.log" Execute='immediate' Return='asyncNoWait' /> 
    <CustomAction Id='UninstallP2Action' Directory='SystemFolder' ExeCommand="[SystemFolder]MSIExec.exe /X {PRODUCT_CODE_HERE} /qn /l* $(env.windir)\Temp\p2.log" Execute='immediate' Return='asyncNoWait' /> 
    <CustomAction Id='UninstallP3Action' Directory='SystemFolder' ExeCommand="[SystemFolder]MSIExec.exe /X {PRODUCT_CODE_HERE} /qn /l* $(env.windir)\Temp\p3.log" Execute='immediate' Return='asyncNoWait' /> 
    <CustomAction Id='UninstallP4Action' Directory='SystemFolder' ExeCommand="[SystemFolder]MSIExec.exe /X {PRODUCT_CODE_HERE} /qn /l* $(env.windir)\Temp\p4.log" Execute='immediate' Return='asyncNoWait' /> 
    <CustomAction Id='UninstallP4Action' Directory='SystemFolder' ExeCommand="[SystemFolder]MSIExec.exe /X {PRODUCT_CODE_HERE} /qn /l* $(env.windir)\Temp\p4.log" Execute='immediate' Return='asyncNoWait' /> 

</Fragment> 

我打电话此CA在我的产品脚本像...

 <!--Uninstall Plug-ins --> 
     <Custom Action='UninstallP1Action' After='InstallFinalize'>(REMOVE="ALL")</Custom> 
     <Custom Action='UninstallP2Action' After='UninstallP1Action'>(REMOVE="ALL")</Custom> 
     <Custom Action='UninstallP3Action' After='UninstallP2Action'>(REMOVE="ALL")</Custom> 
     <Custom Action='UninstallP4Action' After='UninstallP3Action'>(REMOVE="ALL")</Custom> 
     <Custom Action='UninstallP5Action' After='UninstallP4Action'>(REMOVE="ALL")</Custom> 

我的问题这里,

  1. 如何卸载基地时干净地卸载所有插件?

  2. 当卸载插件时没有创建日志。但是插件正确卸载后,日志创建成功。如何检查这个?

  3. 我知道在单个MSI中创建功能(针对不同的插件)。但我们的计划是将插件作为单独的MSI提供。 WiX中有其他可能的方式吗?

任何帮助将非常感激!

回答

6

如何在卸载base时干净地卸载所有插件?

您的卸载自定义操作不等待返回。所以他们基本上是一个接一个地启动卸载命令而不用等待每个进程完成。

Windows安装程序不支持同时运行两个InstallExecuteSequences。所以两个卸载进程不能同时运行。由于您同时启动多个卸载进程,因此其中一些失败。

解决方案使用BAT文件来执行卸载命令。它在启动下一个命令之前等待每个命令完成。缺点是,卸载完成后,无法从目标计算机轻松删除BAT。

当卸载插件时没有创建日志。 但插件正确卸载后,日志创建成功。 如何检查?

Windows安装程序会自动检测冲突的安装或卸载进程。所以你的插件在开始写日志之前卸载失败。

我知道在单个 MSI内创建功能(针对不同的插件)。但我们的计划是将插件作为单独的MSI提供。任何其他 可能的方式在WiX中可用?

不是。

+0

感谢您的详细信息Cosmin Pirvu。我试图用.bat文件复制到[SYSTEMFOLDER]但没有运气。我的蝙蝠文件的内容就像是......'@echo off cls MSIExec.exe/X {PUT_PRDUCT_CODE_HERE}/qn/l *%windir%\ Temp \ p1.log“MSIExec.exe/X {PUT_PRDUCT_CODE_HERE}/qn/l * %windir%\ Temp \ p2.log MSIExec.exe/X {PUT_PRDUCT_CODE_HERE}/qn/l *%windir%\ Temp \ p3.log“ Temp \ p4.log“MSIExec.exe/X {PUT_PRDUCT_CODE_HERE}/qn/l *%windir%\ Temp \ p5.log” – Muthukkumaran

+0

我会使用自定义操作来卸载每个插件,我会安排在InstallInitialize之前进行卸载InstallExecuteSequence,而不是UserInterfaceSequence,如果bat文件设置完成,只要在安装程序继续之前设置完成,就可以使用相同的调度。 –

+1

使用WiX,可以在引导程序中拥有多个MSI和EXE。请参阅Bundle文档:http ://wixtoolset.org/documentation/manual/v3/xsd/wix/bundle.html您将使用的标签是,。 – TomEberhard