运行RemovePreviousVersion时,MSI不会安装所有文件

时间:2009-03-18 23:45:57

标签: installer wix windows-installer wix3

我使用WiX版本3进行了MSI构建。

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

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

我们已经尝试使用详细和额外的日志记录(/l*vx)运行但是我们只能看到文件是否未注册&然后安装。

有什么想法或建议吗?这推动了我们的发展。

4 个答案:

答案 0 :(得分:18)

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

您的方案中发生的情况很可能如下:

  1. Windows Installer确定要安装的文件。它决定不需要安装某些文件(可能是因为它们已经存在并且与MSI中的版本相同或更新)。
  2. 删除了以前版本的软件,包括Windows Installer确定不需要安装的文件。
  3. Windows安装程序会为新安装安装文件,但不会安装确定不需要安装的文件。
  4. 最终结果是升级软件后缺少一堆文件。设置REINSTALLMODE = amus而不是omus可能会解决您的问题,但您应该确保知道这会如何影响您的其他安装。如果有任何文件不希望被覆盖,则需要将这些组件标记为“从不覆盖”。

答案 1 :(得分:5)

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

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

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

所以,不是100%确定原因是什么 - 我怀疑可能有奇怪的锁或什么,但设置为amus没有任何不利影响,所以我们会坚持这一点。

感谢您的建议。

(此外,有关此属性的更多详细信息,请访问:MSDN: REINSTALLMODE Property

答案 2 :(得分: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>

答案 3 :(得分: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

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

所以我们在每个发行版上更新产品guid(而不是产品升级guid)。

补救措施是稍微更改此dll的生成脚本,以将程序集版本设置为“ 10.0。 1 。{git rev-list --count HEAD}”,大概已被处理作为更高编号的版本。

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