在Wix中进行重大升级会在添加/删除程序中创建2个条目



我遵循了正式的主要升级指南,我似乎缺少一些东西。这是我的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>

它所做的只是简单地安装一个文件作为示例。到目前为止,一切都很好。现在,我要做的就是添加另一个ComponentFile,并在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(有一个博客,解释了介绍大量级元素。该博客还显示了如何手动做事的示例。带有"较旧元素"UpgradeUpgradeVersion(请检查一下(。

我进行了一个快速的模型,可以做您想要的,这只是"草稿" - 无法保证。我使用预处理器定义来设置一些可以在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." />

相关内容

  • 没有找到相关文章

最新更新