配置WiX项目以安装多个版本,但删除相同的次要版本

时间:2013-02-05 14:23:49

标签: wix wix3

我需要配置我的WiX项目才能安装产品的多个次要版本。 IE:我可以安装1.0,1.1和1.3。如果我尝试安装1.2,它会工作,但是如果我用1.1尝试它,它会在继续之前卸载之前的1.1安装。

到目前为止,这就是我在Upgrade标记中的内容:

<Upgrade Id="$(var.UpgradeCode)">
    <UpgradeVersion Minimum="$(var.MajorMinorVersion)" IncludeMinimum="yes" 
        Maximum="$(var.VersionNumber)" IncludeMaximum="no" Property="OLDERMINORFOUND"/>
</Upgrade>

UpgradeCode是我的wxi文件中定义的guid,MajorMinorVersionVersionNumber相同,但构建为0(当版本为1.1.12时为1.1.0)

我猜我有两种可能性:

我制作另一个UpgradeVersion代码或更新当前代码以在下一个次要版本中获得最大值并将其从搜索中排除:

<UpgradeVersion Minimum="$(var.MajorMinorVersion)" IncludeMinimum="yes" 
        Maximum="$(var.NextMinorVersion)" IncludeMaximum="no"/>

使用自定义操作以某种方式设置NextMinorVersion。也许改为使用房产。

或者,每次次要版本更改时手动更改UpgradeCode。或者guid的前几个字符代表版本,其余的是唯一的?我怀疑这是一个好主意...

基本上,实现这一目标的最佳方法是什么,希望只为所有版本设置一个安装项目?

修改

我已查看了MajorUpgrade标记,但我认为我无法将其配置为同时拥有许多次要版本。对此有所了解。

我还研究过制作一个预处理器扩展,它可以使用函数来操作版本号,所以我可以这样做:

<Upgrade Id="$(var.UpgradeCode)">
    <UpgradeVersion Property="OLDERMINORFOUND"
        Minimum="$(var.MajorMinorVersion)" IncludeMinimum="yes" 
        Maximum="$(myprefix.NextMinor($(var.VersionNumber)))" IncludeMaximum="no"/>
</Upgrade>

详情请参阅我的回答。

1 个答案:

答案 0 :(得分:2)

所以我根据WiX手册(Part 1Part 2)编写了一个扩展程序。

我制作了一个预处理器扩展,它接受一个版本号字符串(例如:1.2.3.4)并通过解析和拆分字符串来操作该版本。

所以现在我可以在我的.wxs文件中写这个:

<Upgrade Id="$(var.UpgradeCode)">
    <UpgradeVersion Property="SAMEMINORFOUND" OnlyDetect="no"
        Minimum="$(var.MajorMinorVersion).0" IncludeMinimum="yes" 
        Maximum="$(version.NextMinor($(var.VersionNumber)))" IncludeMaximum="no" />
    <UpgradeVersion Property="OLDERVERSIONFOUND" OnlyDetect="yes"
        Maximum="$(var.MajorMinorVersion).0" IncludeMaximum="no"/>
    <UpgradeVersion Property="NEWERVERSIONFOUND" OnlyDetect="yes"
        Minimum="$(version.NextMinor($(var.VersionNumber)))" IncludeMinimum="yes"/>
</Upgrade>

<InstallExecuteSequence>
    <RemoveExistingProducts After="InstallValidate"/>
</InstallExecuteSequence>

version.NextMinor是对我的预处理程序扩展的调用。

所以我的安装程序只检测产品的安装,除非次要版本匹配,它将被卸载。