我遵循了官方的Major Upgrade指南,我似乎错过了一些东西。 这是我的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="..\ConfigurationFile\x64\tenlira.ini" KeyPath="yes" />
</Component>
</DirectoryRef>
<Feature Id="MainApplication" Title="TenLira" Level="1">
<ComponentRef Id="tenlira.ini" />
</Feature>
</Product>
</Wix>
它所做的只是安装一个文件作为例子。到现在为止还挺好。现在,我所做的就是添加另一个Component
和File
,然后在ComponentRef
中添加相应的Feature
。我特意留下Version
原样:31.00.0000。我的期望是新安装程序不执行重大升级,但确实如此。为什么?此外,添加/删除程序中现在有2个条目。
请帮我看看我在这里缺少什么。谢谢。 Refael。
更新:
发布问题让我重新阅读了文档,发现AllowSameVersionUpgrades
元素中的MajorUpgrade
内容应设置为yes
。这次添加/删除程序中只有一个主菜,但它仍然执行主要升级。为什么呢?
答案 0 :(得分:2)
它进行了重大升级,因为两个MSI都具有相同的UpgradeCode,并且您现在已经指定了AllowSameVersionUpgrades,因此它在之前没有进行升级。
您的构建每次都会生成一个新的ProductCode,因此每个MSI都是一个新产品,因此如果它没有进行升级就会安装两次,如果没有,则会安装一次。您可能对升级工作的方式有一些假设,而您尚未明确说明。
答案 1 :(得分:2)
我猜你通过将auto-generated product GUID
,AllowSameVersionUpgrades
设置为yes
并保持{{version number
,将WiX MajorUpgrade元素按预期完全处理,可能无法完全处理。 1}}一样。
我无法看到在WiX的 MajorUpgrade element 中设置MinInclusive属性的任何明显方法 - 我可能会弄错,可能有一种我不知道的方式的。对于它的价值,我不太热衷于允许&#34;相同的版本升级&#34;。
但是,您可以尝试使用旧方法&#34; &#34;使用&#34;旧元素&#34;创作Upgrade table Upgrade和UpgradeVersion。 MajorUpgrade element本质上是一种方便的&#34;功能可以轻松设置您的主要升级,我相信它适用于大多数用户。 Bob Arnson has a blog explaining the introduction of the MajorUpgrade element。这个博客还展示了如何做事的样本&#34;手动&#34;使用&#34;旧元素&#34; Upgrade
和UpgradeVersion
(请查看)。
我做了一个快速的模拟,可以做你想要的,它只是一个粗略的草稿&#34; - 无法做出任何保证。我使用preprocessor defines来设置一些可以在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:\Projects\MyApp\Release\31.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项目,然后转到: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.11\bin
。
我只想提一下,理想情况下应该通过IniFile table安装INI文件(条目被视为原子键值对,允许高级合并现有INI文件的键和值),而不是通过{ {3}}(该文件被视为常规文件,要么覆盖整个现有文件,要么将其保留到位 - 不强制执行任何新值)。对应于MSI IniFile表的WiX元素自然是File table。
临时样本:
<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>
答案 2 :(得分:0)
在版本相同的情况下,我遇到了相同的问题,但是在添加/删除程序中创建多个条目时,Id不同。 我的简单解决方法是设置AllowSameVersionUpgrades =“ yes”。
<MajorUpgrade AllowSameVersionUpgrades="yes" DowngradeErrorMessage="A newer version of $(var.ServiceName) is already installed." />