Wix打包系列(七) 添加系統必備組件的安裝程序

 我們知道在vs的打包工程中添加系統必備組件是一件很容易的事情,那麼在wix中如何檢測系統必備組件並在安裝過程中安裝這些組件。這裏以.Net Framework組件作爲必備組件爲例:

   

    7.1 檢測.Net Framework 版本

   

    步驟1:爲安裝項目添加WiX .NET extensions庫的引用

    如果是命令行方式使用wix,那麼需要在candle和light的時候添加如下參數:

-ext WiXNetFxExtension
    如果在vs中使用wix,那麼需要添加WixNetFxExtension.dll的引用,在wix安裝目錄下可以找到它。
    
    步驟2:爲安裝項目添加WiX .NET extensions命名空間
    添加了.NET extensions引用之後,還必須爲源文件添加.NET extensions 命名空間,方式是爲Sample.wxs源文件中Wix元素添加如下屬性:
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
     xmlns:netfx="http://schemas.microsoft.com/wix/NetFxExtension">
   
    步驟3:引用適當版本的Property
    在.NET Framework extensions 已經定義了所有現有版本的.NET Framework的Property,包括service pack版本。如果我們需要在安裝項目中使用這些屬性,就必須使用引用它們;比如我們需要檢測.Net Framework 2.0,就必須添加相應的Property引用:
<PropertyRef Id="NETFRAMEWORK20"/>
        “NETFRAMEWORK20”就是.NET Framework extensions 中預定義的.Net Framework 2.0的屬性;如果需要檢測中文語言包,那麼還必須添加”NETFRAMEWORK20_ZH_CN_LANGPACK” 屬性;查看所有現有版本的.NET Framework的Properties,可以翻閱wix 幫助文檔。
  
    步驟4:在Condition條件中使用預定義的Properties

    我們可以在安裝程序的啓動條件中使用預定義的屬性,從而判斷系統是否安裝指定的.NET Framework組件,如:

     
<Condition Message="This application requires .NET Framework 2.0. Please install the .NET Framework then run this installer again.">
    <![CDATA[Installed OR NETFRAMEWORK20]]>
</Condition>
  
  上面代碼意思是:如果沒有安裝.Net Framework 2.0, 將會中斷安裝程序執行,Installed 表示如果在修復或卸載安裝時將不會檢測.Net Framework組件。
   
   步驟5:編譯生成安裝程序
    在一個沒有.Net Framework 2.0的系統環境中運行生成的安裝程序,彈出提示安裝.Net Framework 2.0的錯誤,然後安裝程序被終止。
 
   
    現在我們的安裝程序已經可以檢測.Net Framework 2.0是否安裝了,但是一般情況下,我們希望將.Net Framework組件作爲安裝程序的一部分,當檢測到系統沒有安裝.Net Framework組件的時候會自動安裝.Net Framework組件。windows installer不能將這些組件打包到我們安裝程序中,但是我們可以跟vs打包一樣,使用引導程序(bootstrapper)來實現,引導程序會先執行.Net Framework組件的安裝,然後再執行我們的安裝程序。下面我們提供2種方法,一種是編寫xml代碼的方式在Visual Studio中生成帶引導程序的安裝文件,另一種是使用BMG工具。
   
    7.2 使用Visual Studio製作系統必備引導程序
   
    wix本身不提供引導程序,但是我們可以使用Visual Studio中ClickOnce deployment部件提供的bootstrapper引導程序;下面我們來看看如何爲.Net Framework組件生成ClickOnce 引導程序bootstrapper。
 
    步驟1:在Visual Studio中創建並編譯wix安裝項目
    要生車ClickOnce bootstrapper引導程序,我們不能再使用命令行模式,必須使用VS編譯環境;在vs2005或以上版本,新建wix項目:
image

   移除Product.wxs,將Sample示例源文件拷貝到wix Project所在的目錄,並添加到wix項目中;添加wix命名空間中的wix Extension組件的引用,如圖:

image

    使用candle命令編譯時,我們使用了變量參數-dVersion=1.0.0,這裏同樣需要設置,右鍵項目名稱——》屬性——》Build選項卡——》設置Build參數:

image

    最後編譯生成Sample項目,生成的安裝文件在../bin/Debug/zh-cn下,我們也可以在上面的Build參數中指定安裝語言,也可以同時生成多種語言版本的安裝程序。

 

   需要注意的是:在使用vs製作中文安裝包時,如果引用了WixSqlExtension組件,那麼就必須把SqlExtension的中文資源文件(點擊下載)包括在項目中,否則會編譯錯誤。而在命令行模式下製作中文安裝包時,可以不使用SqlExtension中文資源文件,默認會使用自帶的英文資源文件。

   

    步驟2: 用編輯器打開.wixproj文件

   首先,在vs中打開示例中的Sample項目,然後在解決方案管理器(Solution Explorer)中右鍵Sample項目,選擇卸載項目Unload Project),繼續在解決方案管理器(Solution Explorer)中右鍵Sample項目,選擇編輯Sample.wixproj。

   

    步驟3: 添加必備組件的條目

    在Sample.wixproj文件的下添加如下代碼:

  <ItemGroup>
    <BootstrapperFile Include="Microsoft.Net.Framework.2.0">
      <ProductName>.NET Framework 2.0</ProductName>
    </BootstrapperFile>
  </ItemGroup>

    Include 特性用於表示應安裝的必備組件的名稱。ProductName 項元數據是可選的,它作爲備用項供生成引擎在找不到包時用作用戶友好名稱。除非未指定 ApplicationFile,否則這些項不是必選 MSBuild 輸入參數。對於必須爲應用程序安裝的每個必備組件,都應包含一個相應的項。

    如果 BootstrapperItems 和 ApplicationFile 參數均未指定,則會導致生成錯誤。

   

    步驟4:添加生成引導程序的任務

    在Sample.wixproj文件中添加如下代碼:

<Target Name="AfterBuild">
    <GenerateBootstrapper ApplicationFile="zh-cn/$(TargetFileName)" 
                          ApplicationName="Foobar 1.0" 
                          BootstrapperItems="@(BootstrapperFile)" 
                          ComponentsLocation="Relative" 
                          CopyComponents="True" 
                          OutputPath="$(OutputPath)" 
                          Path="E:/Program Files/Microsoft Visual Studio 8/SDK/v2.0/BootStrapper/" />
</Target>
       ApplicationFile指定引導程序在所有必備組件安裝完以後開始安裝應用程序時使用的文件的路徑;$(TargetFileName)是安裝程序的名稱,如果是製作中文安裝包,wix安裝工程默認生成的安裝文件在輸出目錄下的zh-cn目錄下,這裏根據實際生成目錄的結構填寫不同的路徑
    ApplicationName是在bootstrapper引導程序執行時顯示的應用程序的名稱;
    BootstrapperItems指定要生成到引導程序中的產品;
    ComponentsLocation指定引導程序尋找要安裝的安裝必備組件的位置。此參數可具有下列值:
  • HomeSite:指示必備組件由組件供應商託管。

  • Relative:指示必備組件與應用程序在同一個位置。

  • Absolute:指示所有組件都將在一個集中的 URL 下找到。該值應當與 ComponentsUrl 輸入參數結合使用,ComponentsUrl 指定包含安裝必備組件的 URL。

    如果未指定 ComponentsLocation,將默認使用 HomeSite

    CopyComponents如果爲 true,則引導程序會將所有輸出文件複製到 OutputPath 參數指定的路徑。BootstrapperComponentFiles 參數的值都應當基於此路徑。如果爲 false,則不復制文件,而且 BootstrapperComponentFiles 值將基於 Path 參數的值。
    OutputPath指定 setup.exe 和所有包文件要複製到的位置,這裏設置的目錄是應用程序安裝文件的輸出目錄。
    Path指定所有可用的必備組件包的位置,示例中的Path路徑是對於安裝了VS2005的用戶而言的,如果是安裝了VS2008的用戶,則Path的值應該是:C:/Program Files/Microsoft SDKs/Windows/v6.0A/Bootstrapper
   
    步驟5:生成安裝程序
    保存修改後的Sample.wixproj文件,在解決方案管理器(Solution Explorer)中右鍵Sample項目,選擇重新加載項目(Reload Project),在彈出窗口中選擇“是”,然後生成項目。
   
    我們來看看效果,在沒有.Net Framework 2.0的虛擬機中,運行setup.exe,會彈出安裝.Net Framework 2.0的界面,如圖:image
    點擊接受會開始安裝.Net Framework 2.0組件,安裝完.Net Framework 2.0後會自動安裝Sample.msi。
   
   
    7.3 使用BMG工具製作自定義系統必備引導程序
   
    在使用ClickOnce發佈時,vs自帶了一個系統必備的列表(包括.Net Framework 和c++運行庫等),列表中的必備程序我們是可以用上面的方法制作引導程序;但是這種方法只適用於將系統必備列表中的組件打包,而且需要編寫一些xml代碼,更好的方法是使用BMG(Bootstrapper Manifest Generator)工具,用它可以不用寫任何代碼爲系統必備列表添加新的第三方組件,而且還可以爲組件和安裝程序創建引導程序。
   
    Visual studio2008版本的BMG工具可以到這個地址下載:http://code.msdn.microsoft.com/bmg/Release/ProjectReleases.aspx?ReleaseId=1567
   
    這裏我用一個usb key的驅動程序作爲安裝必備程序的示例:
   
    1、下載安裝BMG
   
    2、打開BMG,版本信息如下:
image
   
    3、點擊菜單File—>New打開新建項目對話框,選擇Package Manifest項目類型。在彈出的對話框中輸入Project Name和Product Code;
image
   
    4、點擊左上的Add Install File按鈕,選擇自定義必備程序所在的路徑:
image  
   
    5、點擊OK,出現如下界面,輸入Display Name,其他屬性可以選填,然後點擊Build生成
image
   
    6、在vs2008中我們就可以看到我們定義的系統必備程序:
image
   
    7、接着點擊菜單—>New,項目類型選擇MSBuild,點擊OK後,出現如下界面:
image

    在General選項卡中輸入生成安裝文件的名稱Name,選擇要安裝的文件Installer。

 

    8、接着點擊Package選項卡,選擇.net Framework 2.0 和USBKey Driver

image

   

    9、點擊Build按鈕,選擇生成目錄,確定後生成MSBuild項目,在輸出目錄下生成安裝文件和引導程序如下:

image

   

    10、運行setup.exe安裝引導程序,會出現安裝USBKey Driver組件的界面,如下:

image

   

    這裏製作的USBKey Driver必備程序並沒有設置啓動條件和檢查,也就是說不管機器上有沒裝這個驅動,都會執行驅動安裝程序,要設置啓動條件和檢查,可以在第5步中設置相關的屬性,具體可參考bmg幫助文檔

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章