【问题标题】:MSI does not install all files when RemovePreviousVersion is run运行 RemovePreviousVersion 时 MSI 不会安装所有文件
【发布时间】:2010-10-14 05:11:56
【问题描述】:

我有一个使用 WiX 版本 3 构建的 MSI。

我们正在部署的产品的所有以前的安装程序都可以在指定的配置下正常工作(即:如果以前的版本存在,请删除,然后安装新版本) - 但是,我们构建的新 MSI 不会在以下情况下安装所有文件它贯穿“删除第一个”路径。

如果我们手动删除现有安装,然后运行新版本,则所有文件都已安装 - 当我在 Orca 中检查 MSI 文件时,文件和功能会显示出来,看起来还不错。

我们已尝试在打开详细日志和额外日志记录 (/l*vx) 的情况下运行,但我们只能看到文件是否没有被注册和安装。

有什么想法或建议吗?这把我们逼上绝路了。

【问题讨论】:

  • 之前安装的文件是否被锁定或正在使用?
  • 这也应该被标记为 wix
  • @Rob Sanders - 没有文件被锁定(据我所知)。在运行卸载之前,会启动一个进程以终止正在运行的应用程序。
  • 小升级,而不是大升级?过去我在使用 InstallShield 时遇到过类似的问题

标签: installation wix windows-installer wix3


【解决方案1】:

根据默认的自定义操作顺序,Windows Installer 会在删除任何现有软件版本之前确定需要安装/覆盖哪些文件。 Windows Installer 使用 REINSTALLMODE 属性的值来告诉它如何决定何时覆盖文件。如果 REINSTALLMODE 包含“o”,那么它只会安装版本不同或文件不存在的文件;仅当文件的修改日期

您的场景中发生的情况很可能如下:

  1. Windows Installer 确定要安装哪些文件。它决定不需要安装某些文件(可能是因为它们已经存在并且与 MSI 中的文件具有相同或更新的版本)。
  2. 删除了以前版本的软件,包括 Windows Installer 确定不需要安装的文件。
  3. Windows 安装程序为新安装安装文件,但不安装它确定不需要安装的文件。

最终的结果是升级软件后丢失了一堆文件。设置 REINSTALLMODE=amus 而不是 omus 可能会解决您的问题,但您应该确保您知道这将如何影响您的其余安装。如果您不想覆盖任何文件,则需要将这些组件标记为“从不覆盖”。

【讨论】:

    【解决方案2】:

    好的,与我所在的其他人交谈帮助我找到了问题的解决方案。

    我们添加了属性REINSTALLMODE 并将其设置为amus。这是什么意思?

    默认情况下,该属性设置为omus,这意味着:如果文件丢失或更旧,则重新安装,为机器和用户配置单元重写注册表,重新安装快捷方式。将其更改为amus 基本上是说:重新安装所有文件。

    所以,不是 100% 确定原因是什么 - 我怀疑可能有奇怪的锁或其他东西,但设置为 amus 不会产生任何不利影响,所以我们会坚持下去。

    感谢您的建议。

    (此外,可以在此处找到有关此属性的更多详细信息:MSDN: REINSTALLMODE Property

    【讨论】:

      【解决方案3】:

      您的<RemoveExistingProducts After=""> 步骤是什么样的?可能是 removeexisting 在安装后运行 - 并删除了以前和当前版本中相同的所有文件。

      我将我的安装程序设置为<RemoveExistingProducts After="InstallInitialize"> 以确保它在其他任何事情之前完成。我不知道它是否正确,但它似乎有效。

          <Upgrade Id="$(var.UpgradeCode)">
              <!--Upgrade code found at http://www.nichesoftware.co.nz/blog/200809/upgradable-msi-installations-with-wix -->
              <!-- Detect any newer version of this product-->
              <UpgradeVersion Minimum="$(var.version)" IncludeMinimum="no" OnlyDetect="yes" Language="1033" Property="NEWPRODUCTFOUND" />
      
              <!-- Detect and remove any older version of this product-->
              <UpgradeVersion Maximum="$(var.version)" IncludeMaximum="yes" OnlyDetect="no" Language="1033" Property="OLDPRODUCTFOUND" />
          </Upgrade>
          <CustomAction Id="PreventDowngrading" Error="Newer version already installed"></CustomAction>
          <InstallExecuteSequence>
              <!-- Prevent Downgrading-->
              <Custom Action="PreventDowngrading" After="FindRelatedProducts">NEWPRODUCTFOUND</Custom>
              <RemoveExistingProducts After="InstallInitialize" />
          </InstallExecuteSequence>
          <InstallUISequence>
              <!-- Prevent Downgrading-->
              <Custom Action="PreventDowngrading" After="FindRelatedProducts">NEWPRODUCTFOUND</Custom>
          </InstallUISequence>
      

      【讨论】:

      • 感谢您的输入 - 我的也设置为 After="InstallInitialize" - 所以我仍然不知道这个问题的原因是什么:|
      • @ranomore:产品 ID 是否设置为 * ?
      • @ranomore:它适用于版本的前 3 个数字,但不适用于第 4 个数字。输出版本看起来像 0.1.SPRINT#.SVN_REVISION#
      • @nils_gate:您可能需要检查构建脚本以确保 SPRINT#.SVN_REVISION# 被 WIX 可见的真实值替换。
      • InstallInitialize 可能会导致 GAC 中缺少程序集:请参阅 blogs.msdn.com/astebner/archive/2007/02/08/…
      【解决方案4】:

      我知道这是一个较旧的线程,但我遇到了解决方案未涵盖的类似问题。就我而言,我有一个 DLL,它实际上是比其前身版本低的版本。此 DLL 永远不会出现在升级安装中。运行

      msiexec /i myproduct.msi /l*vx install2.log
      

      并检查日志显示该文件从未安装过。它只是没有作为安装的文件之一出现在日志中。 MSI 明确包含该文件,最好的证据是修复会放置该文件。此外,使用各种工具分解 MSI 显示文件存在。在干净的机器上直接安装总是可行的。

      这没有帮助:

      msiexec /i myproduct.msi REINSTALL=ALL REINSTALLMODE=amus /l*vx install3.log
      

      我正在使用 Wix 构建 MSI,并且多年来我一直在使用这个脚本。最近我们将脚本设置为完全删除 5.3 版本中的旧目录。这适用于 5.2 -> 5.3 和 5.3 -> 5.4 升级。但在 5.5 版本中,所有 DLL 都使用新版本的 DLL 重新构建。 DLL 项目托管在 GitHub 中。此特定 DLL 的构建脚本设置为“10.0.0.{git rev-list --count HEAD}”的程序集版本。该项目已被移动,导致 HEAD 计数从 444 变为 30。

      wixscript 包含这个,

      define ProductGuid = "{nnnnnnnn-nnnn-nnnn-nnnn-nnnnnnnnnnnn}"
      

      因此我们会在每个版本中更新产品 guid(而不是产品升级 guid)。

      补救方法是稍微改变这个dll的构建脚本,将程序集版本设置为'10.0.1.{git rev-list --count HEAD}',大概是被处理了作为更高编号的版本。

      为什么这有效,我无法解释。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-12-29
        • 2010-12-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多