我遵循了正式的主要升级指南,我似乎缺少一些东西。这是我的MCVE:
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Product Id="*" Codepage="1252" Language="1033" Manufacturer="Bla Corporation"
Name="Bla" UpgradeCode="PUT-GUID-HERE" Version="31.00.0000">
<Package Comments="Contact: Refael Sheinker, refael.sheinker@bla.com." Description="Bla"
InstallerVersion="500"
Compressed="yes"
InstallScope="perMachine"
Keywords="Installer,MSI,Database" Languages="1033" Manufacturer="Bla Corporation" Platform="x64" />
<Media Id="1" Cabinet="my_application.cab" EmbedCab="yes" />
<MajorUpgrade AllowDowngrades="no"
AllowSameVersionUpgrades="no"
Disallow="no"
IgnoreRemoveFailure="no"
MigrateFeatures="yes"
Schedule="afterInstallInitialize"
DowngradeErrorMessage="A later version of [ProductName] is already installed" />
<Property Id="WIXUI_INSTALLDIR" Value="APPLICATIONROOTDIRECTORY" />
<UIRef Id="WixUI_InstallDir" />
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFiles64Folder">
<Directory Id="PROGRAMFILESSUBDIR" Name="Bla">
<Directory Id="APPLICATIONROOTDIRECTORY" Name="BlaInternal" />
</Directory>
</Directory>
</Directory>
<DirectoryRef Id="APPLICATIONROOTDIRECTORY">
<Component Id="tenlira.ini" Guid="*">
<File Id="tenlira.ini" Source="..ConfigurationFilex64tenlira.ini" KeyPath="yes" />
</Component>
</DirectoryRef>
<Feature Id="MainApplication" Title="TenLira" Level="1">
<ComponentRef Id="tenlira.ini" />
</Feature>
</Product>
</Wix>
它所做的只是简单地安装一个文件作为示例。到目前为止,一切都很好。现在,我要做的就是添加另一个Component
和File
,并在Feature
中脱离路线相应的ComponentRef
。我专门将Version
保留为:31.00.0000。我期望的是,新的安装程序将不是执行重大升级,但确实如此。为什么?另外,现在有2个Add/删除程序中的条目。
请帮助我找出我在这里缺少什么。谢谢。Refael。
更新:发布问题使我再次重读了文档,我发现MajorUpgrade
元素中的AllowSameVersionUpgrades
Thing应该设置为yes
。这次,添加/删除程序中只有一个主页,但它仍然可以执行重大升级。为什么?
update :这是一个列表,可以通过识别最常见的问题来帮助调试失败的主要升级:常见原因失败的主要升级
主要升级 - &quot'
我猜您正在碰到一个奇怪的性能,该奇数可能不会像WIX MARIPRADE元素那样完全处理,而AllowSameVersionUpgrades
将CC_10设置为yes
并保持version number
相同。
我看不到任何明显的方法可以在Wix的 marterupgrade Element 中设置Minclusive属性 - 我可能会误会,可能会有一种我不知道的方法。对于它的价值,我不太热衷于"同一版本升级"。
但是,您可以尝试" 使用旧方法"。使用"较旧元素"来撰写升级表。升级和升级。大量Upgrade元素本质上是"便利性"。功能可以轻松设置您的主要升级,我相信它对大多数用户都有效。鲍勃·阿恩森(Bob Arnson(有一个博客,解释了介绍大量级元素。该博客还显示了如何手动做事的示例。带有"较旧元素"Upgrade
和UpgradeVersion
(请检查一下(。
我进行了一个快速的模型,可以做您想要的,这只是"草稿" - 无法保证。我使用预处理器定义来设置一些可以在Wix源文件中引用的变量 - 作为C 开发人员,这是您的一小菜,所以我不会浪费时间来解释它 - 源应该有意义:
<?define MyProductVersion = "31.00.0000" ?>
<?define MyProductCode = "PUT-GUID-HERE" ?>
<?define MyUpgradeCode = "PUT-GUID-HERE" ?>
<!--Recommendation: set a path variable that you can redirect at will to a new release folder (new build output folder): -->
<!-- <?define MyBasePath = "C:ProjectsMyAppRelease31.00.0000" ?> -->
<!-- SAMPLE:
<Component Win64="yes" Feature="MainApplication">
<File Source="$(var.MyBasePath)myapp.exe" />
</Component> -->
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Product Id="$(var.MyProductCode)" Codepage="1252" Language="1033" Manufacturer="Bla Corporation"
Name="Bla" UpgradeCode="$(var.MyUpgradeCode)" Version="$(var.MyProductVersion)">
<Package Comments="Contact: Refael Sheinker, refael.sheinker@bla.com." Description="Bla"
InstallerVersion="500"
Compressed="yes"
InstallScope="perMachine"
Keywords="Installer,MSI,Database" Languages="1033" Manufacturer="Bla Corporation" Platform="x64" />
<Media Id="1" Cabinet="my_application.cab" EmbedCab="yes" />
<!-- Major upgrade -->
<Upgrade Id="$(var.MyUpgradeCode)">
<!-- Downgrade Protection -->
<UpgradeVersion Minimum="$(var.MyProductVersion)" OnlyDetect="yes" IncludeMinimum="yes" Property="DOWNGRADE_DETECTED" />
<!-- Major Upgrade Configuration -->
<UpgradeVersion IncludeMinimum="no" Maximum="$(var.MyProductVersion)" IncludeMaximum="no" MigrateFeatures="yes" Property="UPGRADE_DETECTED" />
</Upgrade>
<!-- Major Upgrade: Schedule RemoveExistingProducts -->
<InstallExecuteSequence>
<!-- Potential scheduling (after): InstallValidate, InstallInitialize, InstallExecute, InstallExecuteAgain, InstallFinalize -->
<RemoveExistingProducts After="InstallInitialize" />
</InstallExecuteSequence>
<!--Launch Condition: Abort setup if higher version found-->
<Condition Message="!(loc.NewerVersionDetected)">
NOT DOWNGRADE_DETECTED
</Condition>
<Property Id="WIXUI_INSTALLDIR" Value="APPLICATIONROOTDIRECTORY" />
<UIRef Id="WixUI_InstallDir" />
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFiles64Folder">
<Directory Id="PROGRAMFILESSUBDIR" Name="Bla">
<Directory Id="APPLICATIONROOTDIRECTORY" Name="BlaInternal" />
</Directory>
</Directory>
</Directory>
<DirectoryRef Id="APPLICATIONROOTDIRECTORY">
<Component Id="Test.ini" Guid="PUT-GUID-HERE" Win64="yes" Feature="MainApplication">
<CreateFolder Directory="APPLICATIONROOTDIRECTORY" />
<IniFile Id="SomeSetting" Action="addLine" Directory="APPLICATIONROOTDIRECTORY" Key="Setting1" Name="Test.ini" Section="MySection" Value="Some Setting" />
<IniFile Id="OtherSetting" Action="addLine" Directory="APPLICATIONROOTDIRECTORY" Key="Setting2" Name="Test.ini" Section="MySection" Value="Other Setting" />
</Component>
</DirectoryRef>
<Feature Id="MainApplication" Title="TenLira" Level="1">
<!--<ComponentRef Id="tenlira.ini" />-->
</Feature>
</Product>
</Wix>
现在必须解释!(loc.NewerVersionDetected)
。这是一个本地化的字符串(用于以不同的语言交付您的设置(。要使用它,请右键单击Visual Studio中的WIX项目,然后Go:Add New Item... => Localization File => Add
。随着添加本地化文件,您的输出MSI现在也将进入您的主输出位置下的en-us
文件夹(调试或发布(。
在本地化文件中,添加:
<?xml version="1.0" encoding="utf-8"?>
<WixLocalization Culture="en-us" xmlns="http://schemas.microsoft.com/wix/2006/localization">
<String Id="NewerVersionDetected">A later version of [ProductName] is already installed.</String>
</WixLocalization>
,您现在应该能够在此文件中添加新字符串,并使用此类语言文件轻松翻译整个设置。
还添加Wix GUI扩展名。Right click "References". Add Reference... => Browse to WixUIExtension.dll => Double click this file, and press OK
。找到文件的普通文件夹是: C:Program Files (x86)WiX Toolset v3.11bin
。
ini-files
我只想提到,理想情况下应该通过inifile表安装INI文件(条目被视为原子密钥值对,允许对现有INI文件的键和值进行高级合并(,而不是通过文件表(文件被视为覆盖整个现有文件或将其放置到位的常规文件 - 不执行任何新值(。对应于MSI Infile表的WIX元素自然是无限元素。
临时样本:
<Component Id="Test.ini" Guid="PUT-GUID-HERE" Win64="yes" Feature="MainApplication">
<CreateFolder Directory="APPLICATIONROOTDIRECTORY" />
<IniFile Id="SomeSetting" Action="addLine" Directory="APPLICATIONROOTDIRECTORY" Key="Setting1" Name="Test.ini" Section="MySection" Value="Some Setting" />
<IniFile Id="OtherSetting" Action="addLine" Directory="APPLICATIONROOTDIRECTORY" Key="Setting2" Name="Test.ini" Section="MySection" Value="Other Setting" />
</Component>
链接:
- 将条目添加到MSI升级以删除相关产品
它进行了重大升级,因为两个MSI都具有相同的升级,并且您现在已指定了lakeMameVersionUpgrades,因此它可以进行升级以前。
您的构建每次都会生成一个新的产品代码,因此每个MSI都是新产品,因此,如果它不进行升级,则可以将其安装两次,并且一次。您可能对尚未阐明的升级工作方式有一些假设。
i在版本相同的情况下遇到了相同的问题,但是ID在add/删除程序中创建多个条目。我的简单修复程序是设置LoseMameVersionUpgrades ="是"。
<MajorUpgrade AllowSameVersionUpgrades="yes" DowngradeErrorMessage="A newer version of $(var.ServiceName) is already installed." />