WiX:使组件可升级,但不可卸载

时间:2012-04-11 15:31:24

标签: wix windows-installer

我正在使用WiX创建一个安装程序(我必须说我真的不喜欢它,但这不是WiX的错误和更多的MSI。而且我绝对赞扬Rob Mensching在这里和其他地方的帮助。)

是否可以创建一个组件:

  • 可以更新(通过补丁和主要升级)
  • 安装后已更改的文件将不会被卸载(如果未更改,它们是否也未被卸载并不重要)
  • 更新时适用普通文件版本控制规则(即,自安装以来未更新的未版本控制文件未更新,其他文件)

我开始认为这是不可能的。将组件标记为永久性意味着组件不会被卸载,这意味着它不可更新(至少不通过主要升级;补丁怎么样?)。

标记组件NeverOverwrite不会阻止它被卸载,即使用户更改了未版本化的keyFile(因此删除了用户的工作)。

即使他们是否定的,我也会表达所有明确的答案。

1 个答案:

答案 0 :(得分:0)

我没有尝试过,但您可能可以使用自定义操作来执行此操作。有关示例,请参阅From MSI to WiX, Part 5Custom Action Type 38示例包括:

<Directory Id="INSTALLDIR" Name="Minimal" LongName="MinimalInstallation">
  <Component Id="Component1"
             Guid="{A77C5B06-132D-4884-8E17-EA10A83C812D}">
    <File Id="ReadMe" DiskId="1" Name="Readme.txt" Source="Readme.txt" Vital="yes" KeyPath="yes" />
    <!--RemoveFile Id="RemoveCopy" Name="ReadMe2.txt" On="uninstall" /-->
  </Component>
</Directory>

....

<CustomAction Id="CopyReadMe"
              Script="vbscript">
  <![CDATA[
  Set fso = CreateObject("Scripting.FileSystemObject")
  path = Session.Property("INSTALLDIR")
  fso.CopyFile path & "ReadMe.txt", path & "ReadMe2.txt"
  ]]>
</CustomAction>

<InstallExecuteSequence>
  <Custom Action="CopyReadMe" After="InstallFinalize">Not Installed</Custom>
</InstallExecuteSequence>

这里安装了Readme.txt,并使用复制到ReadMe2.txt的vbscript自定义操作。如果您在vbscript中执行某些版本和/或修改日期检查,则可以自行控制ReadMe2.txt是否被覆盖。如果没有RemoveFile,wix将不会卸载ReadMe2.txt,因为它不知道该文件是否存在。

对于升级,可能需要使用不同的自定义操作在安装之前将ReadMe2.txt复制回Readme.txt。这样你可以让wix处理普通的文件版本控制规则,以确定是否可以更新Readme.txt。然后,您不必将版本处理添加到vbscript。