【问题标题】:WiX: Make component upgradable, but not uninstallableWiX:使组件可升级,但不可卸载
【发布时间】:2012-04-11 15:31:23
【问题描述】:

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

是否可以创建一个这样的组件:

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

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

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

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

【问题讨论】:

  • 我不确定您是如何得出永久组件不可更新的结论的。我从来没有这样的经历。

标签: wix windows-installer


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-27
    • 1970-01-01
    • 2013-05-15
    • 2018-04-29
    • 1970-01-01
    • 2011-03-18
    • 2014-01-31
    • 1970-01-01
    相关资源
    最近更新 更多