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文件 支持四種文件格式

  View Code

二、如何捆綁

    目的:檢測.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=&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 >= v5.1 OR VersionNT64 >= v5.1) AND (NOT (Netfx4FullVersion=&quot;4.0.30319&quot; OR Netfx4x64FullVersion=&quot;4.0.30319&quot;))"/>
    </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也可以運行前自己動檢測,發現新版本會去提示下載更新,需要借助一個發布網站就行。但那個可配置性就更  低了。應該還有其他的方法,求路過大俠指點一二。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM