Windows Installer 和 WiX 的创建

2023-12-27

我们目前使用 WiX 来构建 MSI 文件,因此它是我有过使用经验的唯一 MSI 构建器。我知道您可以在 Visual Studio 中本地构建安装程序。使用 WiX 和 Windows Installer 有什么区别,各自的优缺点是什么?


我只是想添加一些更具体的内容技术信息关于 Windows Installer 技术本身,以及一些history导致WiX 工具包的创建因为刚刚进入安装程序、WiX 和 Windows Installer 领域的人可能会发现这篇文章。

这是为了快速介绍WiX and MSI from a 开发者视角。 serverfault.com 上还有一篇颇受欢迎的文章,可能有助于了解 Windows Installer 的优点:使用 MSI 文件的企业优势 https://serverfault.com/questions/11670/the-corporate-benefits-of-using-msi-files/274609#274609(许多开发人员不喜欢 Windows Installer,但企业部署的好处实际上相当显着 - 如果您认为 MSI 带来的麻烦大于其价值,也许值得快速浏览一下)。

WiX 工具包的由来

MSI 文件本质上是剥离 SQL Server 数据库,存储为COM http://en.wikipedia.org/wiki/Component_Object_Model- 结构化存储文件。这是 Microsoft Office 中使用的文件格式(请注意,MS Office 过去使用OLE/COM 文件 https://en.wikipedia.org/wiki/COM_Structured_Storage- 但现在较新的版本使用办公室开放 XML https://en.wikipedia.org/wiki/Office_Open_XML),它被设计为一种在单个文件中存储分层数据的方法。本质上是一个文件内的文件系统,具有各种类型的存储流 - 其中之一是要安装在一个或多个内部的文件出租车文件 http://en.wikipedia.org/wiki/Cabinet_(file_format) .

Early on MSI files / databases were best modified directly using third-party tools such as InstallShield http://en.wikipedia.org/wiki/InstallShield, Advanced Installer http://www.advancedinstaller.com/ and Wise Package Studio (no longer available due to legal issues - see a comparison of currently available MSI tools https://stackoverflow.com/questions/1544292/what-installation-product-to-use-installshield-wix-wise-advanced-installer/1546941#1546941).These tools stored the MSI file in its native "installable" format as a COM structured storage file. This meant your MSI file was both source and executable - and in binary format. This made source control of your installation project difficult. Binary diffs on different MSI databases were difficult, and due to database referential integrity even the most basic changes in the MSI will cascade through dozens of tables and make it difficult to see what changed even for trained eyes.

WiX 的出现是为了让开发人员能够从常规文本源文件创建二进制 MSI 文件。就像常规的 EXE 二进制文件一样,MSI 二进制文件是从 WiX 文本 XML 文件“编译”的。这是一个量子飞跃在管理发布过程和了解 MSI 文件中的更改方面。该工具包非常全面,对于开发人员来说更加直观,并且具有一定程度的“自动魔力”,因为它可以使开发人员免受 MSI 数据库架构的一些复杂性的影响,因为更改是使用其自己的架构以 XML 格式进行的,而不是数据库本身。实际上,WiX 将 MSI 从数据库起源带入当今的“XML 时代”,以便开发人员可以使用文本文件,并且 MSI 文件可以被视为已编译的可执行文件,而不是数据库源文件。

实际上,无需过多了解 MSI 文件的内部工作原理,就可以制作良好的 MSI 文件 - 只要您遵循 WiX 最佳实践- 相信我,作为一名开发人员,您会希望远离 MSI 文件。它们很复杂,并且对于开发人员的思维方式来说明显是非正统和违反直觉的。它与将整个安装程序存储为单个数据库的复杂性有关。它几乎完全是声明性的,而不是过程性的 - 但有些部分是连续的并定义安装顺序。许多活动部件和“发条装置”阴谋复杂性“(当你认为一切都很好时发现的陷阱)。

这些测序结构是 MSI 中最复杂的部分,涉及“提升的权利“并且文件系统操作作为数据库事务。当你作为开发者学习MSI时,你一定会觉得“这个设计有问题”,并且事实上,整个技术是围绕 Office 的部署要求而设计的回到过去——事情变得非常复杂。此外,MSI 文件可能是未来事物的预览 - 也许 Windows 将来会使用 SQL Server 作为其主要存储解决方案,而 MSI 是将部署转变为“声明性语言”或庞大的 SQL 语句的第一步。部署期间目标系统上会发生什么?但这只是猜测。

一些实用的 WiX 建议

保持简单,遵循最佳实践,无论你做什么,都不要违背设计——它会反击。如果 WiX 无法做到这一点,它可能会试图帮助您避免部署问题。与您的经理要求简化或更改需求,而不是 MSI - 这一次会更容易:-)。

大多数时候我们发现不寻常的设置设计并且使用自定义操作会导致很多不必要的复杂性,或者部署反模式如果你愿意的话,这个问题通常可以通过以下方式避免应用程序设计的小变化, or 使用内置 MSI 结构。一个好的管理者会努力简化部署,但他们需要理解为什么这是必要的。我喜欢许可 https://stackoverflow.com/questions/24359248/installer-with-online-registration-for-windows-application/24360658#24360658作为一个示例,说明如何通过避免老式或不必要的复杂应用程序和部署解决方案来以不同的方式做事并简化部署。

不惜一切代价避免不必要的(读/写)自定义操作- 它们使设置的复杂性和风险增加了四倍。在 Stack Overflow 上询问并搜索以查看是否有内置替代方案。在大多数或至少很多情况下,MSI 中有等效的内置构造来完成工作。

This particular advice can not be overstated. In my personal opinion, read-only custom actions http://forum.installsite.net/index.php?showtopic=21645#entry60802 (that may set properties) are the opposite: they are recommended. They do not cause significant extra risk in most cases - since they make no changes on the system requiring rollback support, and can be used very effectively to gather setup logic in one place - and crucially they work well between co-workers to allow picking up each other's work when written in simple scripting languages such as JavaScript https://en.wikipedia.org/wiki/JavaScript (some clunky aspects when dealing with the MSI API) or VBScript http://en.wikipedia.org/wiki/VBScript (poor error handling and overall language features, but well tested with the MSI API. Frankly it seems like Microsoft is trying to "kill" the language. JavaScript is at least "alive and well" in heavy use for web-stuff).

总结一下关于脚本的事情:部署专家普遍认为所有类型的脚本操作都是通用的难以调试, 容易受到反病毒干扰 and 缺乏语言特征需要实现高级编码结构。综上所述:使用任何类型的脚本编写健壮的代码都很困难。托管代码自定义操作是可能的 (.NET),但由于需要安装 .NET,安全建议是使用 C++ 编写自定义操作。这允许最小的依赖性、非常好的调试和高级语言结构。这里对这个问题有一个很长的“讨论”:不同自定义操作类型的优缺点 https://stackoverflow.com/questions/46045359/windows-installer-fails-on-win-10-but-not-win-7-using-wix/46058543#46058543(不是很好,只是现实世界经验的转储)。不过,这可能值得浏览一下——自定义操作是部署失败的主要原因 https://stackoverflow.com/questions/46179778/why-is-it-a-good-idea-to-limit-the-use-of-custom-actions-in-my-wix-msi-setups/46179779#46179779(链接到我针对他们的宣传),这给我们带来了下一点:部署的整体复杂性(以及如何处理它)。

部署的复杂性

部署是将异构目标计算机从一种稳定状态迁移到另一种稳定状态的复杂过程

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Windows Installer 和 WiX 的创建 的相关文章

  • 构建后如何在 Windows 上安装 Qt?

    我找不到任何有关如何安装基于 Windows 的 Qt 的信息 在维基文章中如何在 Mac 和 Linux 上设置影子构建 http developer qt nokia com wiki Qt shadow builds有描述 prefi
  • 无法安装 VS 2015 Update 3 [重复]

    这个问题在这里已经有答案了 所以我尝试安装 VS 2015 Update 3 顺便说一句 我有专业版 但我不断收到此屏幕 当然 现在 Update 2 已经安装 但它无法识别这一点 我需要做什么 Go to control panel gt
  • Symfony2:--重新安装问题

    我一直在尝试为 Symfony2 安装 Buzz 我将其添加到 deps 文件中 并尝试更新我的供应商 php bin vendors update 该命令只是告诉我我已经安装了标准版本 并且我应该尝试使用 php bin vendors
  • Innosetup - 在安装开始之前引用[Code]中的文件

    这是一种延续这个问题 https stackoverflow com questions 5658488 adding a help button to an innosetup wizard page 我想将一个文件包含在我的安装包中 C
  • 将安装文件打包为单个可执行安装程序

    我有一个用 C 编写的旧程序的旧设置 其中包含多个安装文件 SETUP 1 SETUP DLL INST32I EX ISDEL EXE SETUP EXE DISK1 ID SETUP INI SETUP INS SETUP LIB SE
  • lib 未指定 & loadNamespace 中出现错误

    我的一切都可以使用 R 和 RStudio 但后来我在清理计算机目录和文件时移动了文件夹 现在我收到以下错误消息 R和RStudio应该安装在Program Files or Program Files x86 我应该有两个libPaths
  • 如何在 wix .wxs 文件中指定

    我想在 Wix 安装程序的 wix wxs 文件中将属性指定为受限属性
  • 与 WiX 3.0 一起安装 WiX 3.5

    是否可以同时安装 WiX 3 0 和 3 5 如果我在安装 3 0 后安装 3 5 它会删除 3 0 文件 如果我尝试在 3 5 之后安装 3 0 它会告诉我已经安装了较新的版本 我正在从 VS 2008 迁移到 VS 2010 因此我的应
  • 在 ubuntu 10 64 位上安装 java 时出错

    EDIT 我添加此注释是为了解释为什么我将这个问题保留在这里 我添加了 Android 作为关键字 我想知道其他人是否尝试过下载代码以及如何解决此问题 我担心如果我问 Ubuntu 他们会建议我使用 OpenJDK 但问题是 有人使用该 S
  • python setup.py Egg_info 失败,错误代码 1

    我正在运行 Ubuntu 17 04 全新安装 并且已经安装了 pip 但是 当我尝试安装任何东西时 我得到以下信息 命令 python setup py Egg info 失败 错误代码为 1 tmp pip build kBfUEp k
  • 从对话框调用 CustomAction 时出现 WiX 安装错误 2762

    我是初学者 开始学习WiX 我想在安装过程中捕获 验证和注册用户详细信息 我创建了一个对话框来捕获用户注册并在用户单击 下一步 后调用自定义操作 但在这里我收到安装程序错误 2762 虽然错误描述说 必须在 InstallInitializ
  • 如何在 Windows 7 上安装适用于 Python 3.5 的 cvxopt

    我最近更新到 python 3 5 0 并想安装 cvxopt 到目前为止还没有运气 所以我尝试了 python 2 7 并按照说明进行操作here http cvxopt org install 我安装了 mingw 4 9 3 并从源代
  • WiX - 根据环境将编译后的 web.config 复制到网站根目录

    作为 WiX 安装的一部分 我将所有转换 编译的 web config 文件复制到安装目录 编译后的 web config 的名称格式为 web ENV config 在我的安装 UI 中 我创建了一个自定义对话框 在其中解析 ENV 并填
  • WiX - 通过检查修订来防止降级

    我正在寻找一种方法来防止我的应用程序降级 但 问题 是 我必须检查修订号 例如 安装 1 0 0 1 时应该可以安装 1 0 0 2 但安装 1 0 0 2 时不应该安装 1 0 0 1 我知道 Element MajorUpgrade 仅
  • /usr/sbin/install 到底有什么作用?

    我正在尝试安装discount https github com Orc discount on my VPS http no de它基于Solaris 设置一些环境变量后编译效果很好 但是安装失败 https gist github co
  • 以静默方式安装应用程序,并授予 INSTALL_PACKAGES 权限

    我正在尝试将 apk 静默安装到系统中 我的应用程序位于 system app 并成功授予权限 android permission INSTALL PACKAGES 但是我在任何地方都找不到如何使用此权限 我尝试将文件复制到 data a
  • Google Cloud SDK 安装失败 UnicodeDecodeError:“ascii”编解码器

    我在安装时遇到以下错误谷歌云SDK https cloud google com sdk docs 在我的 Windows 10 计算机上 ERROR gcloud failed to load ascii codec can t deco
  • Wix:动态添加功能

    我们正在使用 Wix 为我们的软件构建 msi 我们有一些要在目标机器上实现的组件 插件 每个客户端的插件都不同 我们想要做的是创建一个标准构建并修改 msi 包中的功能列表 有没有办法通过自定义操作动态更改功能列表 例如 从自定义操作中读
  • 以编程方式更新 ClickOnce 应用程序的部署清单会导致缺少 4.0 中所需的 <兼容框架> 元素

    我正在致力于自动化 NET 4 0 ClickOnce WPF 应用程序的安装程序 该应用程序需要在应用程序配置文件 我经历了寻找必须遵循的具体步骤的棘手过程Mage exe http msdn microsoft com en us li
  • 使用“Any CPU”而不是“X86”编译wix项目

    当我编译一个wix项目 并且wix通过MSbuild启动所有现有项目的编译时 我可以使用 任何CPU 而不是 X86 或 64位 吗 如果没有 我如何使用 任何CPU 编译项目 如果您的问题是是否可以编译 WIXPROJAny CPU那么答

随机推荐