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

二、如何捆綁
目的:檢測.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也可以運行前自己動檢測,發現新版本會去提示下載更新,需要借助一個發布網站就行。但那個可配置性就更 低了。應該還有其他的方法,求路過大俠指點一二。