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也能夠運行前本身動檢測,發現新版本會去提示下載更新,須要藉助一個發佈網站就行。但那個可配置性就更  低了。應該還有其餘的方法,求路過大俠指點一二。

相關文章
相關標籤/搜索