我们目前使用WiX来构建我们的MSI文件,因此它是我使用过的唯一的MSI构建器.我知道您可以在Visual Studio中本机构建安装程序.使用WiX和 Windows Installer有什么区别,以及各自的利弊?
我只想在Windows Installer技术本身添加一些更具体的技术信息,以及导致WiX工具包创建的一些历史,因为这篇文章可能会由刚刚进入安装程序领域的人们发现,WiX和Windows安装程序.

这是为了从开发者的角度快速介绍WiX和MSI.还有一个受欢迎的serverfault.com文章可能有助于掌握Windows Installer的优势:The corporate benefits of using MSI files.

WiX工具包的起源

MSI文件基本上被删除存储为COM结构化存储文件的sql Server数据库.这是Microsoft Office中使用的文件格式,它被设计为在单个文件中存储分层数据的一种方式.本质上是文件中的文件系统,其中包含各种类型的存储流,其中之一是要安装在一个或多个cab files内的文件.

早期的MSI文件/数据库最好使用第三方工具(如InstallShield和Wise Package Studio)进行直接修改.这些工具将MSI文件以其原生的“可安装”格式存储为COM结构化存储文件.这意味着您的MSI文件既是源代码又是可执行的 – 也是二进制格式.这使您的安装项目的源代码管理变得困难.二进制差异在不同的MSI数据库是困难的,并且由于数据库参照完整性,即使MSI中最基本的变化也将级联通过几十个表,使得很难看到即使是训练有素的眼睛发生什么变化.

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,打败你的经理,一旦更容易:-).

大多数情况下,我们发现不寻常的设置设计和自定义操作的使用会导致大量不必要的复杂性,或者如果您喜欢则部署反模式,并且通常可以通过应用程序设计中的小小更改或使用内置的MSI结构.一个好的经理将允许努力简化部署,但他们需要了解为什么是必要的.我喜欢licensing作为一个例子,你可以做不同的事情,并通过避免旧的或不必要的,复杂的应用程序和部署解决方案使部署更简单.

避免不必要的(读/写)自定义操作 – 它们使设置的复杂性和风险增加了四倍.在Stack Overflow上查询,查看是否有内置的替代方法.在大多数或至少很多情况下,在MSI中有相同的内置结构来完成工作.

这个特别的建议不能夸大.在我个人看来,只读自定义操作(可能设置属性)是相反的:它们被推荐.它们在大多数情况下不会造成重大的额外风险 – 因为它们在需要回滚支持的系统上没有任何变化,并且可以非常有效地用于在一个地方收集设置逻辑 – 并且至关重要的是在VBScript写入同事之间工作良好脚本或类似的简单脚本语言. Not everyone agrees with me on this issue. Here is a better explanation in context.这里是forum.installsite.net.

部署的复杂性

部署是将异构目标计算机从一个稳定状态迁移到另一个稳定状态的复杂过程 – 这需要有纪律的方法:

>错误本质上是累积性的 – 您经常会导致更多的问题,您尝试通过快速修复来解决问题.很快,你不可能保持在你的手上,因为这个问题一般都是“在野外的”(发表),而且必须像一个交付过程一样处理 – 每次迭代都有自己的风险,而不仅仅是一个问题调试,直到你有一个修复.
>当您无法访问有问题的系统时,错误很难调试.记录可以在正确的情况下帮助,但是当您需要调试时,它通常不会传递给您,或者是错误的格式或冗长性,或者完全无用,因为自定义操作通常不会正确记录事件.
>目标系统各不相同(即使是标准操作环境(SOE),大多数公司都使用标准化操作系统安装和软件包),硬件和驱动程序差异(大小),操作系统版本和补丁级别,语言版本,升级状态,恶意软件情况,磁盘空间,分区方案,用户权限设置,连接速度,代理解决方案,应用程序,脚本锁定,运行时版本,无线软件设置,用户数等…

部署是一个简单的概念,复杂的变量组合可能会导致最神秘的错误 – 包括开发人员的喜好:间歇性错误.任何认真的工作和被质疑的人都不能夸大这种错误的严重性.

更多的部署和安装程序真的应该是:What is the benefit and real purpose of program installation?

相关MSI工具

Visual Studio MSI项目文件是一种轻量级的方式来创建一个MSI文件作为Visual Studio的一部分,它的功能集非常有限.有人在谈话中用WiX XML项目替换Visual Studio中的MSI项目类型,这通常是人们如何构建他们的MSI文件.不要使用此项目类型.由于缺乏灵活性和严重错误,对许多用户造成严重问题.

Orca是Windows SDK工具,允许打开,编辑二进制MSI文件并在一定程度上进行比较.这实际上是由后来创建WiX工具包本身的人写的. Rob Mensching,而他在Microsoft的Windows Installer团队工作.该工具还允许其他操作,如生成转换文件来修改MSI文件和其他一些技术操作.虽然它是一个非常基本的工具,缺乏商业工具中最先进的功能,它仍然是一个应用程序包装程序最喜欢的使用,并可用于调试和小修复,由于其可靠性,简单性和“清洁度” – 它不添加“默认垃圾“保存到MSI(第三方工具添加自定义表和类似的垃圾).我使用它来进行小型MSI更新,调试,inspection of the summary stream,创建基本转换,查看补丁,包验证等重要操作.

事实上,我猜想这是一个高级工具,有一个简单的界面 – 而不是一个基本的工具:-).为了掌握Orca,您需要安装Windows SDK(!).有点超过顶部,当工具的大小如此之小,但至少很容易知道它在哪里可用,而不是寻找单独的下载.

DTF – 部署工具基础是一个.NET套件,以程序方式处理MSI文件.写得很好,易于使用,非常强大的是now included with the main WiX download.它是任何项目中自动化企业使用MSI文件的关键组件. Here is a brief answer on serverfault.com讨论其使用和描述其基本组件. DTF附带的帮助文件将使您能够快速使用该工具包,您将永远不会回头看到使用Win32函数或COM类来访问MSI文件.

市面上还有许多其他Windows Installer工具,其中一些可以在What installation product to use? InstallShield,WiX,Wise,Advanced Installer,etc与WiX相比.

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

  1. 详解前端HTML5几种存储方式的总结

    本篇文章主要介绍了前端HTML5几种存储方式的总结 ,主要包括本地存储localstorage,本地存储sessionstorage,离线缓存(application cache),Web SQL,IndexedDB。有兴趣的可以了解一下。

  2. PhoneGap / iOS上的SQLite数据库 – 超过5mb可能

    我误解了什么吗?Phonegap中的sqlitedbs真的有5mb的限制吗?我正在使用Phonegap1.2和iOS5.解决方法您可以使用带有phonegap插件的原生sqliteDB,您将没有任何限制.在iOS5.1中,Websql被认为是可以随时删除的临时数据…

  3. ios – 伞框架

    错误.应用程序,通常位于…错误仍然存在你也可以在这里添加(子)框架的路径.

  4. 如何在xcode 6中构建32位和64位的单二进制文件

    我已经遵循this堆栈溢出解决方案,但即使我得到低于警告.我已经选择虽然我得到了警告.请帮帮我.谢谢.解决方法有同样的问题.看起来将’arm64’添加到ValidArchitectures解决了它.

  5. ios – 领域:如何获取数据库的当前大小

    是否有RealmAPI方法使用RealmSwift作为数据存储来获取我的RealmSwift应用程序的当前数据库大小?

  6. ios – 将二进制文件上传到Apple的iTunesConnect时会发生什么?

    我问,因为:它可能指向我们可以做的事情来加快这个过程.大约一年前,这个过程从“缓慢,因为苹果的服务器功率不足”变得“非常缓慢,因为苹果公司使用的带宽是发送二进制文件所需带宽的3倍”.例如我最近提交了一个90Mb应用程序,Xcode4将超过350Mb的数据上传到Apple.例如刚才我提交了一个8Mb的二进制文件,Xcode4将超过40Mb的数据上传到Apple.最近上传者有了很大的改进.但我想知道:苹果在上传期间实际上做了什么?

  7. ios – Realm – 无法使用现有主键值创建对象

    我有一个对象有许多狗的人.应用程序有单独的页面,它只显示狗和其他页面显示人的狗我的模型如下我有人存储在Realm中.人有详细页面,我们取,并显示他的狗.如果狗已经存在,我会更新该狗的最新信息并将其添加到人的狗列表中,否则创建新狗,保存并将其添加到人员列表中.这适用于coredata.在尝试用他的狗更新人时,领域会抛出异常无法使用现有主键值创建对象解决方法这里的问题是,即使你正在创建一个全新的Rea

  8. ios – UIWebView中的WebSQL / SQLite数据库的最大大小(phonegap)

    我知道一般来说,Web应用程序的本地存储空间有5MB的限制.本地网页浏览应用程式是否也有这个限制?

  9. ios – iTunes Connect警告:“您的二进制文件不支持iPad”

    我刚刚将一个新的二进制文件上传到iTunesConnect,并将其添加到iOS版本的新版本.添加二进制文件并保存更改后,iTunesConnect会显示警告消息:“您的二进制文件不支持iPad,iPad的屏幕截图或应用视频预览将不会显示在AppStore上.”Xcode项目是使用Cordova3CLI生成的;自从应用从Cordova2迁移以来,上传的二进制文件是第一个Cordova3版本.该应用程

  10. ios – 二进制无效,二进制文件缺少体系结构[arm64]

    没有足够的信誉发布图像,请搜索“TimT”作为他的回复.更新:已经修复“是的,最近有一个修复程序应用于服务器,每个人都应该能够再次提交32位应用程序.–由TimT在同一个线程.我再次尝试,一切都很好.

随机推荐

  1. static – 在页面之间共享数据的最佳实践

    我想知道在UWP的页面之间发送像’selectedItem’等变量的最佳做法是什么?创建一个每个页面都知道的静态全局变量类是一个好主意吗?

  2. .net – 为Windows窗体控件提供百分比宽度/高度

    WindowsForm开发的新手,但在Web开发方面经验丰富.有没有办法为Windows窗体控件指定百分比宽度/高度,以便在用户调整窗口大小时扩展/缩小?当窗口调整大小时,可以编写代码来改变控件的宽度/高度,但我希望有更好的方法,比如在HTML/CSS中.在那儿?

  3. 使用Windows Azure查询表存储数据

    我需要使用特定帐户吗?>将应用程序部署到Azure服务后,如何查询数据?GoogleAppEngine有一个数据查看器/查询工具,Azure有类似的东西吗?>您可以看到的sqlExpressintance仅在开发结构中,并且一旦您表示没有等效,所以请小心使用它.>您可以尝试使用Linqpad查询表格.看看JamieThomson的thispost.

  4. windows – SetupDiGetClassDevs是否与文档中的设备实例ID一起使用?

    有没有更好的方法可以使用DBT_DEVICEARRIVAL事件中的数据获取设备的更多信息?您似乎必须指定DIGCF_ALLCLASSES标志以查找与给定设备实例ID匹配的所有类,或者指定ClassGuid并使用DIGCF_DEFAULT标志.这对我有用:带输出:

  5. Windows Live ID是OpenID提供商吗?

    不,WindowsLiveID不是OpenID提供商.他们使用专有协议.自从他们的“测试版”期结束以来,他们从未宣布计划继续它.

  6. 如果我在代码中进行了更改,是否需要重新安装Windows服务?

    我写了一个Windows服务并安装它.现在我对代码进行了一些更改并重新构建了解决方案.我还应该重新安装服务吗?不,只需停止它,替换文件,然后重新启动它.

  7. 带有双引号的字符串回显使用Windows批处理输出文件

    我正在尝试使用Windows批处理文件重写配置文件.我循环遍历文件的行并查找我想要用指定的新行替换的行.我有一个’函数’将行写入文件问题是%Text%是一个嵌入双引号的字符串.然后失败了.可能还有其他角色也会导致失败.如何才能使用配置文件中的所有文本?尝试将所有“在文本中替换为^”.^是转义字符,因此“将被视为常规字符你可以尝试以下方法:其他可能导致错误的字符是:

  8. .net – 将控制台应用程序转换为服务?

    我正在寻找不同的优势/劣势,将我们长期使用的控制台应用程序转换为Windows服务.我们为ActiveMQ使用了一个叫做java服务包装器的东西,我相信人们告诉我你可以用它包装任何东西.这并不是说你应该用它包装任何东西;我们遇到了这个问题.控制台应用程序是一个.NET控制台应用程序,默认情况下会将大量信息记录到控制台,尽管这是可配置的.任何推荐?我们应该在VisualStudio中将其重建为服务吗?我使用“-install”/“-uninstall”开关执行此操作.例如,seehere.

  9. windows – 捕获外部程序的STDOUT和STDERR *同时*它正在执行(Ruby)

    哦,我在Windows上:-(实际上,它比我想象的要简单,这看起来很完美:…是的,它适用于Windows!

  10. windows – 当我试图批量打印变量时,为什么我得到“Echo is on”

    我想要执行一个简单的批处理文件脚本:当我在XP中运行时,它给了我预期的输出,但是当我在Vista或Windows7中运行它时,我在尝试打印值时得到“EchoisOn”.以下是程序的输出:摆脱集合表达式中的空格.等号(=)的两侧可以并且应该没有空格BTW:我通常在@echo关闭的情况下启动所有批处理文件,并以@echo结束它们,所以我可以避免将代码与批处理文件的输出混合.它只是使您的批处理文件输出更好,更清洁.

返回
顶部