0

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

是否可以创建一个组件,使其:

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

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

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

我赞赏所有明确的答案,即使它们是否定的。

4

1 回答 1

0

我没有尝试过,但您可能可以使用自定义操作来执行此操作。有关示例,请参阅从 MSI 到 WiX,第 5 部分。Custom 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,并使用 vbscript 自定义操作复制到 ReadMe2.txt。如果您在 vbscript 中进行一些版本和/或修改日期检查,您可以自行控制 ReadMe2.txt 是否被覆盖。并且没有 RemoveFile,wix 不会卸载 ReadMe2.txt,因为它不知道该文件存在。

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

于 2012-04-11T16:51:22.857 回答