【问题标题】:Force WIX to install 3rdparty msipackage no matter the currently installed version无论当前安装的版本如何,强制 WIX 安装 3rdparty msipackage
【发布时间】:2017-10-13 01:11:51
【问题描述】:

我正在开发一个 wix 安装程序。这个 wix 安装程序会安装一个 3rdparty msipackage。

我希望我的 wix 引导程序项目安装这个 msipackage,无论用户电脑上应该已经存在什么版本。这意味着如果存在相同的版本(或更新的版本),它应该覆盖该安装。

我这样安装我的 msipackage:

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

有人对如何实现这一点有任何想法吗?

【问题讨论】:

  • 我怀疑这可能是不可能的,除非引导程序很聪明,也许它是。通常,尝试安装低于系统上的版本会失败,并显示“更高版本已存在”;安装相同的版本会导致修复。;安装更高版本要求 MSI 具有升级逻辑。如果其中任何一个是问题,您需要检测它是否已经安装并首先卸载它。
  • 我希望用户同意你的行为,因为这有可能以不可预见的方式破坏其他应用程序。

标签: wix windows-installer bootstrapper


【解决方案1】:

使用InstallCondition="1"

这样每次都会安装

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

安装条件

字符串
在安装软件包之前要评估的条件。仅当条件评估为 true 时才会安装该软件包。如果条件评估为 false 并且正在安装、修复或修改包,则将卸载包。

【讨论】:

  • 不,这不起作用,因为它只会“允许”安装,但如果已经安装了包,则此条件将被忽略。
【解决方案2】:

我知道这个很旧,但既然我遇到了这个问题,也许它也会对某人有所帮助。

在我的情况下,修复就足够了,所以虽然从技术上讲它不是重新安装,但实际上修复 = 重新安装。 我需要重新安装 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);
}

在捆绑包中:

<!-- 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;
}

【讨论】:

    猜你喜欢
    • 2014-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-02
    相关资源
    最近更新 更多