如何让WiX主要升级工作?

时间:2010-02-15 22:38:17

标签: wix windows-installer upgrade

我正在努力在WiX中启用主要的升级功能。

我希望安装程序的每个新版本都是主要升级(完全卸载,然后是新安装),因为我们不需要不同的升级和干净安装版本。

我开始尝试使用标记内容,但我一直在“安装另一个版本”。运行安装程序时出现错误消息。

因此,我实施了V3.5中添加的新标记,以便更轻松地进行升级。我仍然收到错误消息。

然后,我在某处读到您需要更改每个新版本的Id GUID。所以我设置Id =“*”来让WiX生成它们。

现在,当我安装较新版本时,它不会卸载旧版本,最终会对同一文件夹进行两次安装。我解决了这个问题,因为运行MSI(新的或旧的)会调出修复/删除屏幕。

该程序也没有被新版本覆盖。

这是我的WiX脚本的开始:

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">

    <Product Id="*"
             Name="Foo"
             Language="1033"
             Codepage="1252"
             Version="!(bind.FileVersion.Foo.exe)"
             Manufacturer="Foo Bar Ltd."
             UpgradeCode="dac2fab2-7d76-4e47-b25f-0748380dab81">

        <Package
                 Description="Foo"
                 Comments="This installer database contains the logic and data required to install Foo."
                 InstallerVersion="300"
                 Languages="1033"
                 SummaryCodepage="1252"
                 Platform="x86"
                 Compressed="yes" />

        <!-- Remove older versions -->
        <!-- Important note: MSI ignores the last version digit 1.0.0.? when comparing versions, so always change at least the 3rd digit for new external releases-->
        <MajorUpgrade DowngradeErrorMessage="The version currently installed is newer than the version you are attempting to install."/>

3 个答案:

答案 0 :(得分:21)

以下是我用于所有软件包的内容片段,并在许多内部和公共版本中进行了改进

<Product Id="*"
         UpgradeCode="$(var.Property_UpgradeCode)"
         Name="!(loc.ApplicationName)"
         Language="!(loc.Property_ProductLanguage)"
         Version="$(var.version)"
         Manufacturer="!(loc.ManufacturerName)" >

    <Package Description="!(loc.Package_Description) $(var.version)"
           Comments="!(loc.Package_Comments)"
           Manufacturer="!(loc.ManufacturerName)"
           InstallerVersion="301"
           Compressed="yes"
           InstallPrivileges="elevated"
           InstallScope="perMachine"
           Platform="$(var.ProcessorArchitecture)" />

    <Media Id="1" Cabinet="media1.cab" EmbedCab="yes" />

    <Upgrade Id="$(var.Property_UpgradeCode)">
        <UpgradeVersion OnlyDetect="yes"
                        Minimum="$(var.version)"
                        Property="NEWERVERSIONDETECTED"
                        IncludeMinimum="no" />

        <UpgradeVersion OnlyDetect="no"
                        Maximum="$(var.version)"
                        Property="OLDERVERSIONBEINGUPGRADED"
                        IncludeMaximum="no" />

        <!-- Detect for changes in 4th field only -->
        <UpgradeVersion Property="ANOTHERBUILDINSTALLED"
                 Maximum="$(var.version)" Minimum="$(var.version)"
                 IncludeMinimum="yes" IncludeMaximum="yes" OnlyDetect="yes" />

    </Upgrade>

    <CustomAction Id="CA_BlockOlderVersionInstall" Error="!(loc.LaunchCondition_LaterVersion)" />
    <CustomAction Id="CA_BlockAnotherBuildInstall" Error="!(loc.LaunchCondition_AnotherBuild)" />

    <InstallExecuteSequence>
        <Custom Action="CA_BlockOlderVersionInstall" After="FindRelatedProducts">
            <![CDATA[NEWERVERSIONDETECTED]]>
        </Custom>

        <!-- Prevent installation on 4th version field change only -->
        <Custom Action="CA_BlockAnotherBuildInstall" After="FindRelatedProducts">
            <![CDATA[ANOTHERBUILDINSTALLED]]>
        </Custom>

        <LaunchConditions After="AppSearch" />

        <!-- Schedule RemoveExistingProducts early -->
        <RemoveExistingProducts After="InstallInitialize" />
    </InstallExecuteSequence>

    <InstallUISequence>
        <Custom Action="CA_BlockOlderVersionInstall" After="FindRelatedProducts">
            <![CDATA[NEWERVERSIONDETECTED]]>
        </Custom>

        <!-- Prevent installation on 4th version field change only -->
        <Custom Action="CA_BlockAnotherBuildInstall" After="FindRelatedProducts">
            <![CDATA[ANOTHERBUILDINSTALLED]]>
        </Custom>

        <LaunchConditions After="AppSearch" />
    </InstallUISequence>

    <!-- .... -->

</Product>

答案 1 :(得分:1)

我知道这篇文章很老并且已经回答了,但是,如果有人遇到这个问题,我的升级安装程序就出现了问题。升级部分都很好。安装程序将运行,但是,以前的版本从未被删除,因此,未安装新版本。问题是这个

<Feature Id="ProductBinaries" Title="ProductBinariesInstaller" Level="0">

等级=&#34; 0&#34;以上,应该是Level =&#34; 1&#34;如下所示:

<Feature Id="ProductBinaries" Title="ProductBinariesInstaller" Level="1">

斯科特

答案 2 :(得分:1)

如果对发现这个帖子的人有任何用处,我也遇到了类似的问题,我刚刚想到了。

在我的情况下(并且仍处于开发安装程序的早期阶段),关键的区别在于,在版本之间,我已经从每用户安装切换到每台机器安装。更具体地说,我将以下行添加到Product.wxs:

<Property Id='ALLUSERS' Value='1'/>

我仍然关注Windows安装程序的许多特性,但我认为通过这种方式切换安装类型可以与多种方式转换为互斥的版本控制流相比(甚至可以并行安装两个相同的版本!)。

令人遗憾的是,Windows控制面板无法明确区分每用户和全用户的安装。