我使用WiX版本3进行了MSI构建。
我们正在部署的产品的所有先前安装程序在指定的配置下工作正常(即:如果存在先前版本,删除,然后安装新版本) - 但是,我们构建的新MSI不会安装所有文件它贯穿“先移除”路径。
如果我们手动删除现有安装,然后运行新版本,则会安装所有文件 - 当我在Orca中检查MSI文件时,会显示文件和功能,看起来没问题。
我们已经尝试使用详细和额外的日志记录(/l*vx
)运行但是我们只能看到文件是否未注册&然后安装。
有什么想法或建议吗?这推动了我们的发展。
答案 0 :(得分:18)
根据默认的自定义操作序列,Windows Installer会在删除任何现有版本的软件之前确定需要安装/覆盖哪些文件。 Windows Installer使用REINSTALLMODE属性的值来告诉它如何决定何时覆盖文件。如果REINSTALLMODE包含“o”,那么它只会安装版本不同或文件不存在的文件;如果文件的修改日期是< =创建日期(即文件未被修改),则仅安装非版本化文件。如果REINSTALLMODE包含“a”,它将始终安装该文件,无论附加到现有文件的任何版本或日期信息如何。
您的方案中发生的情况很可能如下:
最终结果是升级软件后缺少一堆文件。设置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}”,大概已被处理作为更高编号的版本。
为什么这样做有效,我无法解释。