Wix 安装部署(五) Bootstrapper 捆绑安装
Wix的xml配置确实很费劲,忍不住有点像吐槽一下,前四篇完成的功能在Windows Installer中通过配置能很快的弄出来。可惜有很多加了锁的功能在InstallShield Limited Edition 版本中是用不了的。 但基本满足安装需求了。按照这个目录(下图)一个一个去配,配出来的也像样了(这里就不说了)。但是无法定制行为,以及打补丁等。wix又是一个极端,完全依赖xml。这两天想解决自动检测.net framework版本没有就自动安装的功能和注册dll的就很费劲。 在Windows Installer中分别在Redistributables和Registry中设置就行了,特别是注册,可以直接把目录从你自己的电脑上拖过来。但今天要讲的,就是wix中的Bootstrapper 项目,制作一个捆绑安装程序,也是Windows Installer中没有的。将多个需要安装的文件,按照顺序一次性装完。
一、Bootstrapper 初识
起因:wix的Setup 项目是无法自动安装.net framework的,必须要通过bootstrapper 应用程序去驱动wix中的Burn引擎来安装。在wix中只能判断有无合适的版本再终止安装。前提是要引入WixNetFxExtension.dll。xml代码如下
<PropertyRef Id="NETFRAMEWORK40FULL"/>
<Condition Message="This application requires .NET Framework 4.0"> <![CDATA[Installed OR NETFRAMEWORK40FULL]]> </Condition>
所以需要新建一个bootstrapper 项目
会生成一个Bundle的wxs文件 支持四种文件格式
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Bundle Name="Bootstrapper1" Version="1.0.0.0" Manufacturer="" UpgradeCode="dcf1682c-0a71-460f-9179-793a502c444b">
<BootstrapperApplicationRef Id="WixStandardBootstrapperApplication.RtfLicense" /> <Chain>
<!-- TODO: Define the list of chained packages. -->
<!-- <MsiPackage SourceFile="path\to\your.msi" /> -->
</Chain>
</Bundle>
</Wix>
二、如何捆绑
目的:检测.net版本,没有匹配的就自动安装,然后再安装我们自己的工程。
1.先在Bootstrapper工程中引用WixNetFxExtension.dll 这个动态链接库中 已经包含了各种.net 版本
2.在Chain 元素中添加安装清单。
<Chain>
<PackageGroupRef Id="NetFx40Web"/>
<MsiPackage Id="Scada" SourceFile="D:\VS2012\SCADASetup\SCADASetup\bin\Debug\SCADASetup.msi"></MsiPackage>
</Chain>
这里PackageGroupRef Id的意思就是没有.Net Framework4.0就从web上下载了安装,当然你如果安装了4.5,这个是向下兼容的,不会再给你装一个4.0。其他版本的如下所示:
NetFx40Web |
.Net Framework 4.0 Full web setup. |
NetFx40Redist |
.Net Framework 4.0 Full standalone setup. |
NetFx40ClientWeb |
.Net Framework 4.0 Client Profile web setup. |
NetFx40ClientRedist |
.Net Framework 4.0 Client Profile standalone setup. |
NetFx45Web |
.Net Framework 4.5 web setup. |
NetFx45Redist |
.Net Framework 4.5 standalone setup. |
这里的MsiPackage就是我们自己的打包工程,会在.net版本确定之后安装,且地址对就行了,没有必要复制到根目录下,生成的时候他会自动一个exe安装文件。 但是 所以在Bootstrapper中的安装程序都是没有窗口的。安装顺序一个个默默的装完,没有上一步,下一步。和Click Once部署的一样。一次性装完。
如果要让MSI安装文件显示界面,要设置属性DisplayInternalUI为yes 就可以看展示出界面了
<PackageGroupRef Id="NetFx40Web"/>
<MsiPackage SourceFile="$(var.MSIPath)SCADASetupWix.msi" DisplayInternalUI="yes" />
3.安装文件设置。
上面就是一个简单的捆绑安装程序了,我们还可以进一步配置。 可以现在Fragment元素中把文件先设置好,在加入到链表中。
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" xmlns:bal="http://schemas.microsoft.com/wix/BalExtension"
xmlns:netfx="http://schemas.microsoft.com/wix/NetFxExtension"
xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
<Bundle Name="DIAView" Version="1.0.0.0" Manufacturer="Delta" UpgradeCode="87714fb5-9cdb-4323-af55-821c05974378" IconSourceFile="$(var.Photoes)diaapp.ico" Compressed="yes" >
<BootstrapperApplicationRef Id="WixStandardBootstrapperApplication.RtfLicense" >
<bal:WixStandardBootstrapperApplication LicenseFile="$(var.Photoes)license.rtf" LogoFile="$(var.Photoes)dialogo.jpg" />
</BootstrapperApplicationRef> <!--<BootstrapperApplicationRef Id="ManagedBootstrapperApplicationHost"> IconSourceFile="$(var.Photoes)diaapp.ico"
<bal:WixStandardBootstrapperApplication LicenseFile="$(var.Photoes)license.rtf" LogoFile="$(var.Photoes)scon.ico" />
</BootstrapperApplicationRef>--> <Chain>
<!--<PackageGroupRef Id="NetFx40Web" />-->
<PackageGroupRef Id="Netfx4Full" />
<MsiPackage Id="DIAView" SourceFile="$(var.Dia)DIAViewSetUp.msi" Compressed="no" DisplayInternalUI="yes"/>
</Chain>
</Bundle> <Fragment>
<!--<PackageGroup Id="Netfx4Full">
<ExePackage Id="Netfx4Full" Cache="no" Compressed="no" PerMachine="yes" Permanent="yes" Vital="yes" InstallCommand="/q"
SourceFile="$(var.Dia)dotNetFx40_Full_x86_x64.exe"
DetectCondition="(Netfx4FullVersion="4.0.30319") AND (NOT VersionNT64 OR (Netfx4x64FullVersion="4.0.30319"))"
DownloadUrl="http://go.microsoft.com/fwlink/?LinkId=164193"
InstallCondition="(VersionNT >= v5.1 OR VersionNT64 >= v5.1) AND (NOT (Netfx4FullVersion="4.0.30319" OR Netfx4x64FullVersion="4.0.30319"))"/>
</PackageGroup>-->
<util:RegistrySearchRef Id="NETFRAMEWORK40"/>
<PackageGroup
Id="Netfx4Full">
<ExePackage
Id="Netfx4FullExe"
Cache="no"
Compressed="no"
PerMachine="yes"
Permanent="yes"
Vital="yes"
SourceFile="$(var.Dia)dotNetFx40_Full_x86_x64.exe"
InstallCommand="/q /norestart "
DetectCondition="NETFRAMEWORK40"
DownloadUrl="http://go.microsoft.com/fwlink/?LinkId=164193"/>
</PackageGroup>
</Fragment>
</Wix>
(注释部分的检测.net4.0有问题,每次都会装一次.net4.0 甚至会在32位系统中造成重启。)
ExePackage 就是专门针对exe文件,MsiPackage正对msi文件,其他以此类推。说几个重要的属性:Compress=“yes” 表示是压缩,no的话,debug中这个安装包就会独立出来,全部是yes的话最终就一个exe文件。
Permanent="yes" 表示如果是卸载的话,这个文件会保留,为no的话,用户卸载的时候会一起卸载掉。VersionNT 变量代表系统,5.1指的是xp
4.判断是否注册。
我们用RegistrySearch来搜索注册表,切可以制定检测顺序
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
<Fragment>
<util:RegistrySearch Id="Path"
Variable="UniqueId"
Root="HKLM,SOFTWARE\Microsoft\MyProduct\Unique Id\"
Key="Product"
Result="Value" />
<util:RegistrySearch
Variable="patchLevel"
Root="HKLM,SOFTWARE\Microsoft\MyProduct\[UniqueId]\Setup"
Key="PatchLevel"
Result="Exists"
After="Path" />
</Fragment>
</Wix>
这里的表示的就是在执行Path之后在执行第二个注册表搜索,且结果你存储在Variable中的,而这个Variable就可以作为,是否安装的一个条件。
<ExePackage
SourceFile="[sources]\packages\shared\MyPackage.exe"
DownloadURL="http://mywebdomain.com/?mypackage.exe
InstallCommand="/q /ACTION=Install"
RepairCommand="/q ACTION=Repair /hideconsole"
UninstallCommand="/q ACTION=Uninstall /hideconsole "
InstallCondition="x86 = 1 AND OSVersion >= v5.0.5121.0 AND patchLevel = 0" />
</PackageGroup>
这种一次性安装的方式还是觉得不太好,有些强制性。这里只做个简单的参照。
很多PC软件都是可以自动检测版本,下载更新,VS自带的ClickOnce也可以运行前自己动检测,发现新版本会去提示下载更新,需要借助一个发布网站就行。但那个可配置性就更 低了。应该还有其他的方法,求路过大侠指点一二。
Wix 安装部署(五) Bootstrapper 捆绑安装的更多相关文章
- Dynamics CRM安装教程五:ADFS安装配置
ADFS即联合身份认证是一种更加安全的身份验证方式下面开始进行ADFS打开服务器管理器,到添加角色和功能向导下一步到下面界面勾选Active Directory 联合身份认证服务,下一步 默认,下一步 ...
- Storm介绍及安装部署
本节内容: Apache Storm是什么 Apache Storm核心概念 Storm原理架构 Storm集群安装部署 启动storm ui.Nimbus和Supervisor 一.Apache S ...
- Kafka介绍及安装部署
本节内容: 消息中间件 消息中间件特点 消息中间件的传递模型 Kafka介绍 安装部署Kafka集群 安装Yahoo kafka manager kafka-manager添加kafka cluste ...
- 安装部署Tomcat服务器
安装部署Tomcat服务器 案例1:安装部署Tomcat服务器 案例2:使用Tomcat部署虚拟主机 案例3:使用Varnish加速Web 1案例1:安装部署Tom ...
- 开源分布式实时计算引擎 Iveely Computing 之 安装部署(2)
在Github中下载代码和二进制程序中,您都会看到一个bin\iveely computing目录,里面即是Iveely Computing的运行库. 以前总是有 ...
- 一分钟完成MySQL5.7安装部署
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://suifu.blog.51cto.com/9167728/1855415 Part ...
- CentOS下SparkR安装部署:hadoop2.7.3+spark2.0.0+scale2.11.8+hive2.1.0
注:之前本人写了一篇SparkR的安装部署文章:SparkR安装部署及数据分析实例,当时SparkR项目还没正式入主Spark,需要自己下载SparkR安装包,但现在spark已经支持R接口,so更新 ...
- Linux Centos6.9下安装部署VNC的实操详述
VNC (Virtual Network Console)是虚拟网络控制台的缩写.它 是一款优秀的远程控制工具软件,由著名的AT&T的欧洲研究实验室开发的.VNC 是在基于 UNIX和 Lin ...
- centos 安装部署zabbix
Zabbix_server初始安装部署 各模块要安装的模块 Server:server+nginx+mysql+php Agentd:agentd Proxy:proxy+mysql 1.准备环境: ...
随机推荐
- brackets快捷键使用
ctrl+b 当选中一个文本时,会出现相同的文本,被高亮显示 按ctrl+b 相同的文本就全部获得了焦点 这样就可以同时更改这些相同的文本ctrl+e 打开或关闭快速编辑alt+u 注释ctrl ...
- 如何做一个avalon组件
在avalon1.5中改用更直观的自定义标签来声明组件,废掉ms-widget,引入更强大的生命周期管理,可以让组件任意套嵌. 组件是由JS,HTML,CSS构成 JS 以AMD形式组织,引入HTML ...
- 【原】JS原型的动态性及实例与原型的关系
今天再读了<JS高程>的第六章,有了些深入的感悟和理解,总结分享一下. 创建对象的方式有很多,有一种是动态原型模式,最实用的是构造函数与原型组合的模式,原型的动态性在这两个模式里都有所体现 ...
- Spring 定时执行任务
好不容易写了半天的文章竟然由于断网而丢失了,并未自动保存到草稿箱.只能简单的贴贴代码了. <?xml version="1.0" encoding="UTF-8&q ...
- 用window.showModelDialog() 打开的页面的返回值
有两个页面也个 Default1.aspx 另外一个是 Default2.aspx Default1.aspx 有个按钮是用来打开Default2.aspx页面的 按钮的js代码是 var win ...
- machine learning----->学习成绩
斯坦福大学机器学习公开课学习成绩:
- 写shell脚本速查笔记
linux shell脚本的语法蛋疼,而且对于java开发人员来说又不常用,常常是学了一次等到下次用的时候又忘记了.因此制作这个速查笔记,用于要写shell脚本时快速回忆&速查. 获取当前脚本 ...
- java io学习之File类
1.先看下四个静态变量 static String pathSeparator The system-dependent path-separator character, represented a ...
- Java学习笔记16--异常
异常 异常是导致程序中断运行的一种指令流,如果不对异常进行正确的处理,则可能导致程序的中断执行,造成不必要的损失, 所以在程序的设计中必须要考虑各种异常的发生,并正确的做好相应的处理,这样才能保证程序 ...
- mfc中Button、Edit Control和MFC EditBrowse Control的用法
[前(fei)言(hua)] 写LL(1)分析器被CString转string卡了一个多小时也是醉了. 趁着还算清醒写下这次用到的控件的使用方法好了. 这次实验的mfc用到了四个控件:Edit Con ...