我们现在已经使用WiX一段时间了,尽管人们普遍抱怨易用性,但它还是相当不错.我正在寻找的是有用的建议:
我们使用wix来创建我们的设置.对于升级,我们使用主要升级,如Rob Mensching的回答所示.(在较新的wix版本中,您可以使用MajorUpgrade元素.)这通常很有效.删除旧产品,然后安装新产品.
但是,显然上述内容并不完全等同于手动卸载旧产品然后手动安装新产品.
考虑例如以下场景:
显然,使用上面链接的wix升级逻辑,从1.1版升级到1.2时,3rdparty dll将消失.修复是必要的,以恢复它.
还有另一种升级方式,这适用于这种情况吗?我想我正在寻找的是升级逻辑,它允许降级组件,其行为就像手动卸载旧产品然后手动安装新产品一样.
我有CI构建系统在开发人员检查更改时构建MSI.我们对已安装的MSI进行自动验收测试.
基本上每个MSI都是产品的完整安装,因此我们本身没有任何版本控制(ala Windows安装程序).
每个MSI具有相同的产品GUID和升级GUID,以及相同的版本号.但是有一个不同的包GUID(在wix中使用'*').
我想要实现的是,当安装程序运行时,它将"卸载"任何以前安装的产品版本,并安装新的..所有这些都来自一个MSI(我们有一个不受我们控制的复杂安装过程.. citrix和sccm,所以我们想给他们一个简单的安装路径)
我试过了:
<Property Id='PREVIOUSVERSIONSINSTALLED' Secure='yes' />
<Upgrade Id='$UPGRADE_GUID'>
<UpgradeVersion Minimum='1.0.0.0'
Maximum='99.0.0.0'
Property='PREVIOUSVERSIONSINSTALLED'
IncludeMinimum='yes'
IncludeMaximum='no' />
</Upgrade>
Run Code Online (Sandbox Code Playgroud)
并有:
<InstallExecuteSequence>
<RemoveExistingProducts After='InstallFinalize' />
</InstallExecuteSequence>
Run Code Online (Sandbox Code Playgroud)
并尝试过:
<InstallExecuteSequence>
<RemoveExistingProducts After='InstallInitialize' />
</InstallExecuteSequence>
Run Code Online (Sandbox Code Playgroud)
但是当我尝试从后续版本安装msi时,我得到:
Another version of this product is already installed. Installation of this version cannot continue.
To configure or remove the existing version of this product, use Add/Remove Programs on the Control Panel.
Run Code Online (Sandbox Code Playgroud)
这不是我真正想要的......
我知道我可以只更新产品标签中的Version属性,但这很难管理.首先,我可以每天生成20多个msi构建,因为我有许多生成MSI的构建管道,并且不确定如何以有意义的方式处理版本编号.
也许Windows Installer不允许这种类型的"始终覆盖安装版本"安装?
我们来讨论以下主题.目前正在部署的应用程序有很好的知道xcopy方法.这种方法很难管理依赖项,文件更新等.有一些软件包的帮助下启动应用程序部署的想法,你知道你在Linux的帮助下RPM,但适用于Windows.
所以我有疑问:在Windows经典Windows安装程序(msi)或nuget或其他东西上使用什么包系统更好?
在这个问题的精神中,Si在这里:WiX技巧和提示.我试图确定基于目录获取创建wix片段的最佳方法.文件收获,可以这么说.例如,在bin\release文件夹下,我可以拥有许多不同的文件夹以及我想要在片段中轻松捕获的文件.我一直在键入或使用wixedit这样做.
请注意我在这里没有尝试任何东西:A)我读了一点关于热量.(http://installing.blogspot.com/2006/04/heatexe-making-setup-easier.html)我我不确定从msbuild运行它?B)我从Newagesolution发现了这篇博客文章,该文章讨论了使用t4脚本:http://blog.newagesolution.net/2008/06/how-to-use-msbuild-and-wix-to-msi.html
我想知道其他人正在做些什么来解决这个问题.
问候,Brian
我发现Wix v3使用工具(heat.exe)将信息"收集"到WiX片段中.要么我正在寻找错误的位置,要么这是一个很薄的文件.
对于包含媒体文件的复杂文件夹结构,自动生成WiX片段(可能使用heat.exe)的最佳方法是:
这样他们可以通过WiX内置到安装程序中,并且可以承受升级和补丁吗?
它(相当)指出v3还没有"完成"(因此文档和教程的稀缺性).我现在的感觉是,在我的构建脚本中自动执行此操作并非易事,而且现在工具正在增长以简化此操作.
简而言之,创建卸载条目的方法如下:
<Shortcut Id="UninstallProduct"
Name="Uninstall My Application"
Target="[SystemFolder]msiexec.exe"
Arguments="/x [ProductCode]"
Description="Uninstalls My Application" />
Run Code Online (Sandbox Code Playgroud)
根据罗布Mensching的建议在这里,如果应用程序是足够小,你不需要处理小更新和次要升级(我不),你可以强制每次更新是一个重大的升级.这在这里显示.我用Rob的建议是这样的:
<Product Id="*" UpgradeCode="PUT-GUID-HERE" Version="$(var.ProductVersion)">
<Upgrade Id="PUT-GUID-HERE">
<UpgradeVersion OnlyDetect="yes" Minimum="$(var.ProductVersion)" Property="NEWERVERSIONDETECTED" IncludeMinimum="no" />
<UpgradeVersion OnlyDetect="no" Maximum="$(var.ProductVersion)" Property="OLDERVERSIONBEINGUPGRADED" IncludeMaximum="no" />
</Upgrade>
<InstallExecuteSequence>
<RemoveExistingProducts After="InstallInitialize" />
</InstallExecuteSequence>
Run Code Online (Sandbox Code Playgroud)
现在我的问题是,如果产品ID是随机的(*)以允许进行重大升级,是否有其他方法可以将卸载快捷方式添加到开始菜单,还是我们必须通过添加/删除程序来实现?我更喜欢在开始菜单中创建快捷方式,因为它对用户来说更容易.显然它现在的方式,它将无法工作,因为msiexec参数中使用的[ProductCode]将在每次安装时更改.谢谢.
我正在尝试进行重大升级,但它无法正常工作.它只是将新程序与旧程序一起安装.他们是在不同的目录(如我的新版本改变了目录结构),所以没有冲突,但旧的需求,以被删除我的产品正常运行.
<Property Id="UPGRADE_NEEDED" Secure="yes" />
<Property Id="SAME_OR_NEWER_VERSION" Secure="yes" />
<InstallExecuteSequence>
<RemoveExistingProducts After="InstallFinalize" />
</InstallExecuteSequence>
<Upgrade Id="{PUT-YOUR-GUID-HERE}">
<UpgradeVersion Minimum="5.1.3" OnlyDetect="yes" IncludeMinimum="yes" Property="SAME_OR_NEWER_VERSION" />
<UpgradeVersion Minimum="5.1" Maximum="5.1.3" Language="1033" Property="UPGRADE_NEEDED" MigrateFeatures="yes" IncludeMinimum="yes" />
Run Code Online (Sandbox Code Playgroud)
这是我的升级元素(当然删除了GUID).如果有人能找到问题所在,我将非常感激.
我创建了一个WIX安装程序(使用WIX 3.6),运行得很好.我在IIS上"安装"网站并使用VSDBCMD命令自定义操作部署数据库.数据库自定义操作是在卸载期间创建问题的操作.它在unistall期间实际上不应该运行,现在在卸载期间它失败并出现错误 - "删除成功或错误状态:1603".(来自应用程序日志)
所以我现在有两个问题 - > 1.如何指示WIX在卸载过程中不运行自定义操作?2.如何卸载早期MSI的剩余部分.有手动的方法吗?
提前致谢!
我尝试了几乎所有解决方案列表页面如何实施WiX安装程序升级?,但没有升级成功.升级时始终提示此消息:
"已安装此产品的另一个版本.此版本的安装无法继续.要配置或删除此产品的现有版本,请使用"控制面板"上的"添加/删除程序".
当我跟踪安装程序日志时,它显示:
已安装此产品的另一个版本.此版本的安装无法继续.要配置或删除此产品的现有版本,请使用"控制面板"上的"添加/删除程序".{CCA05551-C990-4ACA-9B01-A65AA9FBF884} MSI(c)(50:40)[13:49:33:462]:产品: - 配置失败.
MSI(c)(50:40)[13:49:33:462]:Windows Installer重新配置了该产品.产品名称:产品版本:2.0.1.6.产品语言:1033.重新配置成功或错误状态:1638.
我错过了任何配置?
在部署到生产环境之前,我正在OPS环境中对MSI进行兼容性检查.
我正在部署的第一部分是最新的MSI说"在MSIv1之上的MSIv2到OPS环境,MSIv2自动卸载MSIv1并安装MSIv2而没有任何问题.
现在,当我在MSIv2上安装MSIv1时.MSIv1已安装,它在安装的控制面板中显示.但是当我看到目录路径时,bin文件夹中没有.dll文件.
我正在日志文件中记录MSI的操作告诉...日志:不允许安装组件:{AC7BC9EB-4F1D-4FEE-B0C2-478966229D8E}因为存在具有更高版本密钥文件的相同组件
我已经在我的电脑上安装了设置.然后我在代码中做了一些更改,并用新的MSI构建了MSI.现在,当我尝试安装应用程序时,我收到一个错误,因为"已经安装了该产品的另一个版本,请删除旧版本".
我想重新安装它,而不是显示此警告.这可能吗?