4

我需要配置我的 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,MajorMinorVersion与 相同VersionNumber,但构建为 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>

有关详细信息,请参阅我的答案。

4

1 回答 1

2

所以我根据 WiX 手册(第 1部分和第 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对我的预处理器扩展的调用在哪里。

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

于 2013-02-06T19:42:03.940 回答