Wix 安装部署(五) Bootstrapper 捆绑安装

原文: Wix 安装部署(五) Bootstrapper 捆绑安装

     Wix的xml配置确实很费劲,忍不住有点像吐槽一下,前四篇完成的功能在Windows Installer中经过配置能很快的弄出来。惋惜有不少加了锁的功能在InstallShield Limited Edition 版本中是用不了的。 但基本知足安装需求了。按照这个目录(下图)一个一个去配,配出来的也像样了(这里就不说了)。可是没法定制行为,以及打补丁等。wix又是一个极端,彻底依赖xml。这两天想解决自动检测.net framework版本没有就自动安装的功能和注册dll的就很费劲。 在Windows Installer中分别在Redistributables和Registry中设置就好了,特别是注册,能够直接把目录从你本身的电脑上拖过来。但今天要讲的,就是wix中的Bootstrapper 项目,制做一个捆绑安装程序,也是Windows Installer中没有的。将多个须要安装的文件,按照顺序一次性装完。html

      

1、Bootstrapper 初识 web

     原由:wix的Setup 项目是没法自动安装.net framework的,必需要经过bootstrapper 应用程序去驱动wix中的Burn引擎来安装。在wix中只能判断有无合适的版本再终止安装。前提是要引入WixNetFxExtension.dll。xml代码以下bootstrap

  <PropertyRef Id="NETFRAMEWORK40FULL"/>
    <Condition Message="This application requires .NET Framework 4.0"> <![CDATA[Installed OR NETFRAMEWORK40FULL]]> </Condition>

    因此须要新建一个bootstrapper 项目app

   

  会生成一个Bundle的wxs文件 支持四种文件格式dom

<?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>
View Code

2、如何捆绑ide

    目的:检测.net版本,没有匹配的就自动安装,而后再安装咱们本身的工程。post

   1.先在Bootstrapper工程中引用WixNetFxExtension.dll 这个动态连接库中 已经包含了各类.net 版本网站

   2.在Chain 元素中添加安装清单。ui

 <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。其余版本的以下所示:url

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部署的同样。一次性装完。

  

  3.安装文件设置。

    上面就是一个简单的捆绑安装程序了,咱们还能够进一步配置。 能够如今Fragment元素中把文件先设置好,在加入到链表中。

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
  <Bundle Name="Bootstrapper" Version="1.0.0.0" Manufacturer="RJ" UpgradeCode="c2fed8a6-9b9a-43e1-9138-76d8c7c2662d">
    <BootstrapperApplicationRef Id="WixStandardBootstrapperApplication.RtfLicense" />
    <Chain>
      <PackageGroupRef Id="NetFx40Webpackage"/>
      <PackageGroupRef Id="ScadaMsi"/>
    </Chain>

  </Bundle>
  <Fragment>
    <PackageGroup Id="NetFx40Webpackage">
      <ExePackage Id="NetFx40Web" Cache="no" Compressed="yes" PerMachine="yes" Permanent="yes" Vital="yes" InstallCommand="/q"
          SourceFile=".net4.0\dotNetFx40_Full_x86_x64.exe"
          DetectCondition="(Netfx4FullVersion=&quot;4.0.30319&quot;) AND (NOT VersionNT64 OR (Netfx4x64FullVersion=&quot;4.0.30319&quot;))"
                DownloadUrl="http://go.microsoft.com/fwlink/?LinkId=164193"
            InstallCondition="(VersionNT >= v6.0 OR VersionNT64 >= v6.0) AND (NOT (Netfx4FullVersion=&quot;4.0.30319&quot; OR Netfx4x64FullVersion=&quot;4.0.30319&quot;))"/>
    </PackageGroup>
    <PackageGroup Id="ScadaMsi">
      <MsiPackage Id="SCADA" Cache="no" Compressed="yes" Permanent="no" SourceFile="D:\VS2012\SCADASetup\SCADASetup\bin\Debug\SCADASetup.msi">
      </MsiPackage>
    </PackageGroup>
  </Fragment>
</Wix>

 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也能够运行前本身动检测,发现新版本会去提示下载更新,须要借助一个发布网站就行。但那个可配置性就更  低了。应该还有其余的方法,求路过大侠指点一二。

相关文章
相关标签/搜索