16

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

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

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

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

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

4

4 回答 4

18

根据默认的自定义操作顺序,Windows Installer 确定在删除任何现有软件版本之前需要安装/覆盖哪些文件。Windows Installer 使用 REINSTALLMODE 属性的值来告诉它如何决定何时覆盖文件。如果 REINSTALLMODE 包含“o”,那么它只会安装版本不同或文件不存在的文件;仅当文件的修改日期 <= 创建日期(即文件未修改)时,才会安装非版本化文件。如果 REINSTALLMODE 包含“a”,它将始终安装文件,而不管附加到现有文件的任何版本或日期信息。

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

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

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

于 2009-04-14T14:46:08.970 回答
5

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

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

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

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

感谢您的建议。

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

于 2009-03-19T04:46:08.043 回答
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>
于 2009-03-19T00:06:13.240 回答
1

我知道这是一个较旧的线程,但我遇到了解决方案未涵盖的类似问题。就我而言,我有一个 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 include 有这个,

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

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

补救措施是稍微更改此 dll 的构建脚本以将程序集版本设置为“10.0.0”。1 .{git rev-list --count HEAD}',大概被视为更高编号的版本。

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

于 2018-08-23T14:01:09.940 回答