天天看點

使用WiX Toolset建立.NET程式釋出Bootstrapper(安裝政策管理)(一)——初識WiX

Visual Studio 打包安裝七宗罪

        開發.NET的人,肯定會使用Visual Studio裡面自帶的MSI打包安裝工具架構。如果是在一般情況下,這個打包安裝架構已經完全足夠滿足産品釋出安裝的需要了。它的制成品,是一個setup.exe,一個MSI安裝檔案,如果你選擇項目以來的其他.NET,Windows Install 架構,并且确定随産品釋出,那制成品中還會包含這些東西的安裝檔案。

        但是VS打包釋出出來的安裝包,安裝體驗實在是非常差,舉個例子,如果你的項目是依賴于.NET 4.0以及VC++ 2010,并且你的目标客戶機中沒有安裝過任何該類産品,那當你執行setup.exe的時候,先是會彈出.NET 4.0客戶安裝協定,使用者點選“同意”後,再彈出VC++ 2010客戶安裝協定,使用者再次點選“同意”,才能開始真正安裝。并且在安裝過程中,每安裝一個東西,如果是在Vista之上的系統上,就會彈出一次需要确認安裝并且提升權限的對話框,實在是不勝其煩。

        并且這個打包的選項也非常奇怪,如果會使用Installer釋出工具的,就會記得裡面永遠隻能在“網上下載下傳所需依賴項”和“本地包含所需依賴項”中二選其一。那如果我想定制釋出安裝包,如果發現依賴項不存在,再自動去網上下載下傳呢?不好意思,做不到。而且如果我打包出來的MSI是中文的,那釋出的時候必定會帶上.NET的中文語言包。如果不是修改系統的bootstrapper配置,這個語言包就是必須跟着的,真是完全無厘頭,我産品是多語言安裝的,難道.NET也要多語言包嗎?

必須掌握的一些基礎概念

        Wix的全稱是(Windows Installer XML),簡而言之,就是用XML來配置和定制個性化的安裝方案。其中一部分稱為Burn,是本文接下去要着重介紹的Bootstrapper開發架構,另一部分則為Setup開發架構。

        先說一下Bootstrapper和MSI的差別,MSI是微軟比較新的一套安裝解決方案,依賴于Microsoft Install Service,其實MSI可以了解為一套強格式的安裝庫,MSI檔案中包含了一系列資料結構和檔案,資料結構說明了例如要建立哪些目錄,要建立哪些系統資料庫項,要拷貝哪些檔案到哪些目錄中,建立什麼快捷方式等配置資訊,以及需要拷貝釋出的所有檔案資料。然後安裝服務通過這些配置資訊,讀取并一步步執行,最終就完成了一個MSI的安裝過程。MSI檔案就是一個更強大的壓縮檔案安裝包。

        問題是如果你的城西使用純C++開發的,那隻要一個MSI釋出就解決問題了,因為釋出以後不依賴于其他東西可以直接執行。但是既然你用了微軟的東西,現在.NET幾乎是Windows上必須會涉及的架構,那大多數程式都會依賴于.NET。這時候問題就來了,如果客戶機上沒有安裝.NET,怎麼辦?你又不能把.NET單獨帶在你的MSI中一起釋出。這個時候就需要在安裝MSI之前判斷一下系統的安裝環境,比如有沒有安裝.NET,如果已經裝了就不用再安裝了,當然其他的一些架構也需要判斷,這些提前判斷的事情MSI是做不了的,當然你的程式也做不了,因為還沒有.NET環境啊,你的程式是用.NET寫的!這不是雞生蛋蛋生雞的問題嗎?

        這些問題其實微軟也想到了,是以他們自己做了一個簡單的setup.exe,你看,這個是exe檔案,不依賴于任何其他架構,這個exe會先判斷系統環境,并且做出需要下載下傳安裝其他架構的決定,然後等基礎環境搞定了,就可以安裝後我們的MSI了。這個exe,就被稱為bootstrapper。

WiX Bootstrapper開發教程

        以上所說的這些問題,在WiX中都可以得到解決,當然你甚至可以不用VS的打包釋出工具,因為之前我們已經知道,WiX可以開發自己的MSI,隻是文本對這個不再詳述,VS的打包工具制作出MSI,再用WiX的Bootstrapper安裝,相得益彰,省時省力,WiX畢竟隻能XML編寫,還是很麻煩的。

        首先,我們在http://wixtoolset.org/releases中下載下傳WiX Toolset安裝檔案,VS 2010好像最多支援到3.7版本,然後點選中間齒輪的那一行Install進行架構安裝。這個工具是支援VS插件的,安裝完成後,VS中就會多出一種項目類型“Wix Toolset”,并且選中後我們選擇“Bootstrapper Project”,即可建立出新項目,我們在這個項目中進行我們的bootstrapper開發。

使用WiX Toolset建立.NET程式釋出Bootstrapper(安裝政策管理)(一)——初識WiX
使用WiX Toolset建立.NET程式釋出Bootstrapper(安裝政策管理)(一)——初識WiX

        建立完成後,就會多出一個Bootstrapper項目,其中有Bundle.wxs檔案,這個檔案就是打包安裝配置檔案。所有的XML元素,都可以通過http://wix.sourceforge.net/manual-wix3/schema_index.htm查詢,預設代碼如下:

<?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="5240b0e0-2b53-44c9-9837-05e9a4b63dbc">
		<BootstrapperApplicationRef Id="WixStandardBootstrapperApplication.RtfLicense" />

		<Chain>
			<!-- TODO: Define the list of chained packages. -->
			<!-- <MsiPackage SourceFile="path\to\your.msi" /> -->
		</Chain>
	</Bundle>
</Wix>
           

        下面我們來逐個标簽元素來看一下這個檔案是如何影響運作的

        Bundle,這個是所有配置的根節點,其中Name就是我們釋出的産品名稱,可自定義,注意該名稱會出現在安裝對話框的标題欄以及解除安裝程式清單中的名稱。Version是版本号,Manufacturer是開發者名稱,這些都會出現在解除安裝程式清單中,UpdateCode是很重要的屬性,如果兩個産品的UpdateCode一樣,那Version更大的産品會自動将小版本程式解除安裝後再安裝,也就是自動的覆寫安裝。這些概念都是所有的安裝架構通用的。

        BootstrapperApplicationRef這個概念比較複雜,按照我使用下來的經驗,這個就是使用已經定義完成的安裝架構模闆,Id="WixStandardBootstrapperApplication.RtfLicense"是一個已經現有的安裝架構界面,表示這個Bootstrapper執行後會顯示一個客戶安裝協定對話框,對話框中的文本是可以自定義的。我們會在之後的篇幅中講到這個元素的詳細自定義。

        Chain,這個就是表示安裝的序列,所有的自定義安裝順序就在這個節點中完成,比如我們可以先定義安裝a.exe,再安裝b.msi,再安裝c.msp等等,都可以在這個節點中進行配置。

        我們來編輯一下wxs檔案,指定Bundle/@Manufacturer的屬性内容,以及為Chain增加一個子節點,Chain節點中必須有一個子節點,我們可以随便生成一個.msi安裝檔案,然後複制到我們的bootstrapper項目中,然後增加Chain中的子元素Msi,并且生成一下這個工程,最後的wxs檔案如下:

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" xmlns:bal="http://schemas.microsoft.com/wix/BalExtension">
	<Bundle Name="DemoWixBootstrapper" Version="1.0.0.0" Manufacturer="VanPan" UpgradeCode="5240b0e0-2b53-44c9-9837-05e9a4b63dbc">
    <BootstrapperApplicationRef Id="WixStandardBootstrapperApplication.RtfLicense"/>
		<Chain>
      <MsiPackage SourceFile="Setup1.msi"/>
		</Chain>
	</Bundle>
</Wix>
           

        其中Setup1.msi檔案,就是随便拿VS生成的一個Install成品MSI,你也可以使用你自己的項目MSI替換之。生成後,在項目的Debug檔案夾内,就會看到有一個Bootstrapper1.exe檔案,大小比我們放入的Setup1.msi略大,其實這個就是把MSI打包到安裝exe中的結果。輕按兩下一下exe,就能看到安裝畫面了。

使用WiX Toolset建立.NET程式釋出Bootstrapper(安裝政策管理)(一)——初識WiX

        我們看到,标題欄就是我們自定義的Bundle/@Name屬性内容,你可以自己點選一下Install按鈕體驗一下安裝的效果,當然這個還是一個非常粗糙的樣品。請放心,這個架構絕對絕對不會和你想象得那麼簡單。我們後面的文章再繼續詳解如何自定義安裝序列,自定義安裝協定,本地化安裝界面,甚至調整安裝界面布局。

繼續閱讀