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

时间:2018-02-12 11:54:51

标签: wix windows-installer major-upgrade

我遵循了官方的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>

它所做的只是安装一个文件作为例子。到现在为止还挺好。现在,我所做的就是添加另一个ComponentFile,然后在ComponentRef中添加相应的Feature。我特意留下Version原样:31.00.0000。我的期望是新安装程序执行重大升级,但确实如此。为什么?此外,添加/删除程序中现在有2个条目。

请帮我看看我在这里缺少什么。谢谢。 Refael。

更新: 发布问题让我重新阅读了文档,发现AllowSameVersionUpgrades元素中的MajorUpgrade内容应设置为yes。这次添加/删除程序中只有一个主菜,但它仍然执行主要升级。为什么呢?

3 个答案:

答案 0 :(得分:2)

它进行了重大升级,因为两个MSI都具有相同的UpgradeCode,并且您现在已经指定了AllowSameVersionUpgrades,因此它在之前没有进行升级。

您的构建每次都会生成一个新的ProductCode,因此每个MSI都是一个新产品,因此如果它没有进行升级就会安装两次,如果没有,则会安装一次。您可能对升级工作的方式有一些假设,而您尚未明确说明。

答案 1 :(得分:2)

重大升级 - &#34;旧的,手动的方式&#34;

我猜你通过将auto-generated product GUIDAllowSameVersionUpgrades设置为yes并保持{{version number,将WiX MajorUpgrade元素按预期完全处理,可能无法完全处理。 1}}一样。

我无法看到在WiX的 MajorUpgrade element 中设置MinInclusive属性的任何明显方法 - 我可能会弄错,可能有一种我不知道的方式的。对于它的价值,我不太热衷于允许&#34;相同的版本升级&#34;。

但是,您可以尝试使用旧方法&#34; &#34;使用&#34;旧元素&#34;创作Upgrade table UpgradeUpgradeVersionMajorUpgrade element本质上是一种方便的&#34;功能可以轻松设置您的主要升级,我相信它适用于大多数用户。 Bob Arnson has a blog explaining the introduction of the MajorUpgrade element。这个博客还展示了如何做事的样本&#34;手动&#34;使用&#34;旧元素&#34; UpgradeUpgradeVersion(请查看)。

我做了一个快速的模拟,可以做你想要的,它只是一个粗略的草稿&#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

INI-文件

我只想提一下,理想情况下应该通过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." />