无论当前安装的版本

时间:2015-04-30 12:12:45

标签: wix windows-installer bootstrapper

我正在开发一个wix安装程序。此wix安装程序将安装第三方msipackage。

我想让我的wix bootstrapper项目安装这个msipackage,无论用户个人电脑上应该存在哪个版本。这意味着如果存在相同版本(或更新版本),则应覆盖该安装。

我像这样安装我的msipackage:

<MsiPackage Id="InstacalFull" Name="Measurement Computing InstaCal" Vital="yes" Compressed="yes" SourceFile="../Suite.SetupBootstrapper/3rdparty/Instacal/InstaCal.msi">

有没有人对如何实现这个有任何想法?

2 个答案:

答案 0 :(得分:0)

使用InstallCondition="1"

每次都会安装

http://wixtoolset.org/documentation/manual/v3/xsd/wix/msipackage.html

InstallCondition

的字符串
安装包之前要评估的条件。只有在条件计算结果为true时才会安装该程序包。如果条件评估为false并且正在安装,修复或修改软件包,则将卸载软件包。

答案 1 :(得分:0)

我知道这个人已经老了,但是因为我遇到了这个问题,也许这对某人也有所帮助。

在我的情况下修复就足够了,所以虽然从技术上说它没有重新安装,但实际上是Repair = Reinstall。 我需要重新安装URLrewrite,因为当IIS Windows功能被禁用时它可能会被破坏。

您需要在自定义BootstrapperApplication类中为PlanPackageBegin添加自定义处理程序,例如:

CustomBootstrapperApplication.Model.Bootstrapper.PlanPackageBegin += this.PlanPackageBegin;
...........

private void PlanPackageBegin(object sender, PlanPackageBeginEventArgs e)
{
    if (e.PackageId.ToLower().Contains("urlrewrite"))
    {
        if (CustomBootstrapperApplication.Model.Command.Action != LaunchAction.Uninstall && e.State == RequestState.Present)
        {
            CustomBootstrapperApplication.Model.Engine.Log(LogLevel.Verbose, string.Format("{0} is installed, forcing Repair", e.PackageId));
            e.State = RequestState.Repair;
        }
    }

    _packageList.Add(e.PackageId, e.State);
}

在Bundle中:

<!-- Note: this Id is used in PlanPackageBegin -->
<MsiPackage Id='urlrewrite2X64' Vital='no'
      Permanent='yes'
      SourceFile="rewrite_amd64.msi"
      DownloadUrl="http://example.com/rewrite_amd64.msi"
      DisplayInternalUI="no"
      Visible="yes"
      InstallCondition="VersionNT64"/>

您可以在升级期间通过PlanPackageBegin中的类似内容强制卸载以前的MSI:

if (LaunchAction.Uninstall == CustomBootstrapperApplication.Model.Command.Action && (CustomBootstrapperApplication.Model.Command.Relation == RelationType.Upgrade))
{
    e.State = RequestState.None;
}