我的安装程序用WiX语言编写 . 它支持主要的升级机制 . 特别要求是 same MSI file will not be possible to install twice.
现在是棘手的部分:如果用户安装然后再次尝试安装(UI模式),安装程序进入维护模式,一切正常(更改/修复将显示为禁用 . )
但是在安装时我们的用例以静默模式状态
msiexec.exe / i installer.msi / qn
第二次安装将继续正常安装(我们不希望这样!)
Some things to noticed about are:
在第二次安装的日志文件中,将跳过序列“ FindRelatedProducts ”(在microsoft文档http://msdn.microsoft.com/en-us/library/windows/desktop/aa368600(v=vs.85).aspx中的状态)
此外,我在这里研究了一下http://windows-installer-xml-wix-toolset.687559.n2.nabble.com/UpgradeVersion-is-not-detecting-the-same-version-preventing-downgrades-td5875840.html有很好的信息,声称在这种情况下我们可以使用Installed属性来检测Product是否已经安装...
However, I get stuck here: because I have to avoid installing previous or same versions than current one and allowing upgrades greater, How could I achieve this in WiX?
谢谢你的帮助!
2 回答
这是不可能做到的 .
尝试安装已安装的软件包时,Windows Installer会自动执行修复 . 没有升级过程 .
此外,基于ProductCode触发维护过程 . 第二次Windows Installer发现其ProductCode已安装并进入维护模式时启动程序包时 . 它与升级没有任何关系 .
仅在更改ProductVersion和ProductCode时才使用升级 .
编辑:
要防止在维护模式下进行自动修复,您可以尝试以下操作:
write a win32 DLL custom action,用于检测产品是否已安装
如果是,则此自定义操作应return 1602
首先,您将修复升级代码:
请注意,每次构建安装时都会重新创建产品代码(不使用GUID,而是使用星号) .
基本信息是产品版本和升级代码 . 产品代码标识特定的已部署版本,而升级代码标识产品将发布“系列” . 具有相同升级代码的软件可以相互切换 . 具有相同产品代码的软件无法安装 .
以下是升级软件的技巧:
通过使用上面的标记,当他发现具有相同UpgradeCode的产品但安装的版本具有大于当前版本的版本时,你说对Wix中止安装,但是如果他发现产品具有产品,则开始安装(升级当前版本)相同的UpgradeCode和已安装的版本具有小于当前版本的版本 .
IncludeMinimum和IncludeMaximum应该可以解决问题,允许升级跳过当前版本 .
Wix不安装相同的产品:您应确保已安装的软件和MSI打包软件的产品代码相同:如果它们不同,则它们是不同的已部署软件 . 除此之外,如果产品具有与MSI相同的产品代码,则安装提供修复/更改选项:要禁用它们,您必须通过引入ARP_变量来使用Wix包的Property表(您可以禁用修复) ,更改和卸载,但也设置制造商联系人和其他属性) .
这是ARP variable list . 我不知道在静默模式下安装时它们的行为是什么,但是如果从命令行调用msiexec,则有一个特定的修复选项来发出修复(/ f),那么如果你是的话,如何自动修复你的产品不要求?