【问题标题】:Automatic updating and upgrade management for Windows Installer XML (WiX)Windows Installer XML (WiX) 的自动更新和升级管理
【发布时间】:2012-03-10 15:38:36
【问题描述】:

我一直在 Visual Studio 2010 中使用 InstallShield LE,但它受到很大限制,有时还存在错误。我查看了付费的 InstallShield 版本,但对于这个价格标签,这些版本也有太多限制。

所以我决定改用 WiX。几年前我有过一些经验。使用 SharpDevelop 和 WiX 工具构建一个简单的安装程序非常容易。

现在我正在尝试为 WiX 收集解决方案和工具。基本上,我需要获得以下功能(由我的客户要求):

  • 当我启动安装程序时,它应该检查服务器上的一个文本文件,看看是否有更新的版本可用。如果是这种情况,那么安装程序应该能够下载更新的安装程序包并启动它(WiX 中是否有任何下载实用程序?)

  • 解决依赖关系。我的应用程序的主要依赖项是 .NET 4(它本身依赖于 Windows Installer 3)。安装程序应该让用户自动下载和安装它们

  • 记录安装过程,同时收集依赖安装过程的日志文件。如果 .NET4 或 WindowsInstaller3 安装失败,我不希望用户搜索各种 .log 文件。所有信息都应该收集在一个地方,如果出现问题,我应该向用户显示一个自定义弹出对话框,其中包含保存完整安装日志文件并将其发送给我的选项

  • 安装程序应该能够检测是否已安装了我的应用的较新版本,并在退出之前显示有意义的自定义错误消息

  • 安装程序应该能够检测是否已经安装了我的应用程序的旧版本。并提供用户退出安装或卸载旧版本并安装新版本。顺便说一句,没有计划进行小组件升级,我更喜欢重新安装一切新鲜的东西(我猜,这是 WindowsInstaller 方面的重大升级)。 Installshield LE 为此失败了,它只是显示了一个错误框,其中包含有关另一个产品的消息,但没有提供卸载它

  • 在升级的情况下,安装程序应该能够检测某些应用程序组件是否正在使用(运行应用程序进程)并显示自定义错误消息,而不仅仅是一些神秘的“安装失败”

我已经读到,即使我的 UpgradeCode 完好无损,管理升级也可能有点痛苦,因为此代码以压缩方式存储在 Windows 注册表中,而且如果用户重命名下载的文件,它可能会得到被 WindowsInstaller 检测为全新产品......或者这可能只是 WindowsInstaller .msi 文件的情况,而 WiX 有一些技巧可以避免这个问题?

关于更新下载 - 我的应用程序本身也需要此功能。我不确定如何有效地实现它,因此我可以在 WiX 安装程序和我的应用程序中重复使用相同的更新下载器代码/实用程序。

是否可以使用当前现有的 WiX 工具来满足所有这些要求,或者我可能需要从头开始编写一些组件的代码?

【问题讨论】:

    标签: wix


    【解决方案1】:

    在我看来,WiX 绝对是必经之路。

    1. 当我启动安装程序时,它应该检查服务器上的文本文件并查看是否有更新的版本可用。如果是这样的话, 那么安装程序应该能够下载更新的安装程序 打包并启动它(WiX 中是否有任何下载工具?)

      在我看来,这种类型的功能最好由应用程序处理。但是,您可以在自定义引导程序中实现此类功能。 WiX 的最新开发包括一个引导程序引擎Burn,允许您在其上编写自己的自定义引导程序。

    2. 解决依赖关系。我的应用程序的主要依赖项是 .NET 4(它本身依赖于 Windows Installer 3)。安装程序应提供 用户自动下载并安装它们

      您可以使用标准的 WiX bootstrapper 作为先决条件安装 .NET。或者,如果您创建自己的自定义托管引导程序应用程序,您可以将 .NET 安装到引导程序的 prereq as in this example

    3. 记录安装过程,也收集依赖安装过程的日志文件。我不希望用户 在 .NET4 或 WindowsInstaller3 的情况下寻找各种 .log 文件 安装失败。所有信息应集中在一个 地方,如果出现故障,我应该向用户显示一个自定义弹出窗口 带有保存完整安装日志文件并发送选项的对话框 它给我

      使用上述两种引导方法,当您启动 msi 时,您可以指定日志记录参数。在我自己的自定义托管引导程序中,我创建了一个按钮来打开安装期间创建的日志文件。

    4. 安装程序应该能够检测到是否已经安装了我的应用程序的更新版本,并显示有意义的自定义错误 退出前的消息

      你可以使用launch conditions来做到这一点

    5. 安装程序应该能够检测是否已安装了我的应用程序的旧版本。并让用户退出安装或 卸载旧版本并安装新版本。顺便提一句, 没有小组件升级计划,我更喜欢重新安装 一切都是新鲜的(我想,这是一个重大的升级 Windows 安装程序)。 Installshield LE为此失败了,它只是 显示了一个错误框,其中包含有关另一种产品的消息,但确实 不建议卸载它

      根据我的经验,major upgrades 是最简单的 接近。

    6. 在升级的情况下,安装程序应该能够检测到某些 应用程序组件正在使用中(运行应用程序进程)和 显示自定义错误消息,而不仅仅是一些神秘的“安装 失败”

      我认为 WiX/Windows 安装程序通常擅长处理这些 场景并自动通知用户 文件/应用程序需要关闭,而无需您创作 安装程序中的任何额外内容。

    综上所述,您可能希望考虑使用 WiX 和 Burn 创建自己的自定义托管引导程序。然而,这并非微不足道。最好的去处是将源代码下载到 WiX Weekly Releases 并签出项目 src\Setup\WixBA。这是他们为安装 WiX 而编写的自定义 BA。由于 WiX 3.6 尚未发布(尽管它非常稳定),因此还没有太多文档。但是,您不必创建自己的 BA 来制作可以处理升级和日志记录的可靠 WiX 安装程序。

    【讨论】:

    • 感谢伟大而详细的解释和有用的链接。我不知道 Burn,我一定会关注它。
    猜你喜欢
    • 2010-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多