如何使WiX在卸载后保留文件?

31

卸载程序后,有没有办法不删除文件?

4个回答

45

Component的值设置为Permanent="yes",如下所示:

<Component Id="LicenseDoc" Guid="*" Permanent="yes">
    <File Id ="License.rtf" Source="$(var.SolutionDir)Installer\License.rtf" />
</Component>

备注:

  • 此定义必须在已安装的MSI和升级的MSI中完成。如果基本MSI没有组件ID,则无论 Permanent="yes"如何,此文件都将被删除。

7
我将问题发布到了wixusers邮件列表,并得到了相同的答案,但还注意到了Permanent标志(由Phil Wilson提供): 只要每个人都意识到Permanent意味着永久性的。它不是指“直到我将设置更改为非permanent”。它使组件在系统上永久存在,除非需要“永久安装程序”,否则我不会使用它。 - glenneroo
我会重新提出这个话题并问:如果您有许多(200+)要保留的文件怎么办?逐个组件添加Permanent="yes"或设置Guid=""感觉不太对。 - treaz
1
但这就是WiX的方式,您正在描述每个文件的有限状态,因此在安装/卸载之前/之后,系统应该如何是毫无歧义的。旧版安装程序的问题在于它们无法处理所有错误,因此会处于奇怪的状态。MSI是一个有状态的过程。 - Simeon Pilgrim
正确的解决方案是编写一个适当的收集脚本,根据您指定的逻辑来管理组件上的Permanent标志。还要注意,在这种情况下,组件ID应该是静态定义的,否则更改文件源路径将更改组件GUID,导致不希望的行为。将所有文件放在单个组件中是一个严重的违规行为,并且会使事情变得过于复杂。 - Tamir Daniely
收集脚本称为heat.exe,已经预装在WiX中。 - berkus

8

感谢来自wixusers邮件列表的Phil Wilson的帮助:

请参考MSI SDK文档中的Component表 - 将组件GUID设置为空(空)。这样做的效果是该组件不会被注册(因此无法进行修复),也不会被卸载。


7

我知道这个问题很旧了,但当我在寻找一种方法让我的安装程序安装缺少的字体时,我偶然发现了它,但是不希望在卸载应用程序时卸载它们。希望能对其他遇到这个问题的人有所帮助。我对提供的两个解决方案(空Guid或将组件设置为永久性)都感到有些不舒服。因此,我想出了这个方法,而且对我有效:

<Feature Id="myFonts" Title="Application Fonts" Level="1">
  <ComponentGroupRef Id="Component_group_with_fonts_to_install" />
  <Condition Level="0">
    <![CDATA[REMOVE = "ALL"]]>
  </Condition>
</Feature>

这种方式安装了字体特性,但是在卸载时,该特性的级别会被设置为0,因此它会保持不变。


1

防止 Windows Installer 在卸载时删除组件的另一种方法是将组件GUID设置为空。这将导致该组件被安装,但永远不会被跟踪或卸载。

参见MSI SDK文档:“...如果此列(ComponentId)为空,则安装程序不会注册该组件,并且该组件不能通过安装程序进行删除或修复。如果此组件仅在安装期间需要,例如清理临时文件或删除旧产品的自定义操作,可能会有意地采取此措施。在将数据文件复制到用户计算机上并不需要注册的情况下,这也可能很有用。"


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接