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>
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="4.0.30319") AND (NOT VersionNT64 OR (Netfx4x64FullVersion="4.0.30319"))" DownloadUrl="http://go.microsoft.com/fwlink/?LinkId=164193" InstallCondition="(VersionNT >= v6.0 OR VersionNT64 >= v6.0) AND (NOT (Netfx4FullVersion="4.0.30319" OR Netfx4x64FullVersion="4.0.30319"))"/> </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也能夠運行前本身動檢測,發現新版本會去提示下載更新,須要藉助一個發佈網站就行。但那個可配置性就更 低了。應該還有其餘的方法,求路過大俠指點一二。