標籤:
原文地址:http://blog.csdn.net/rryqsh/article/details/8274832
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開發。
建立完成後,就會多出一個Bootstrapper項目,其中有Bundle.wxs檔案,這個檔案就是打包安裝設定檔。所有的XML元素,都可以通過http://wix.sourceforge.net/manual-wix3/schema_index.htm查詢,預設代碼如下:
[html] view plaincopy
- <?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檔案如下:
[html] view plaincopy
- <span style="font-size:12px;"><?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></span>
其中Setup1.msi檔案,就是隨便拿VS產生的一個Install成品MSI,你也可以使用你自己的項目MSI替換之。產生後,在項目的Debug檔案夾內,就會看到有一個Bootstrapper1.exe檔案,大小比我們放入的Setup1.msi略大,其實這個就是把MSI打包到安裝exe中的結果。雙擊一下exe,就能看到安裝畫面了。
我們看到,標題列就是我們自訂的Bundle/@Name屬性內容,你可以自己點擊一下Install按鈕體驗一下安裝的效果,當然這個還是一個非常粗糙的樣品。請放心,這個架構絕對絕對不會和你想象得那麼簡單。我們後面的文章再繼續詳解如何自訂安裝序列,自訂安裝協議,本地化安裝介面,甚至調整安裝介面布局。
使用WiX Toolset建立.NET程式發布Bootstrapper(安裝策略管理)(一)-----初識WiX (轉)