WiX 簡介


  最近研究了一下WIX打包,簡單總結一下,方便自己以后查閱,也希望能給需要的人一些提示和幫助。

WiX 簡介

  Windows Installer XML (WiX ) 平台是一組工具與規范,使您能夠創建 Microsoft Windows Installer 數據庫文件(MSI 和 MSM)。WiX 的源代碼是使用 XML 文件編寫的。WiX 源代碼經過預處理、編譯與鏈接,以創建 Windows Installer 數據庫。

  WiX 的下載地址:http://wix.sourceforge.net/ 。目前WiX 的最新版本是 WiX v3.11.2。

  WiX 工具集有兩種使用方式:一種是集成為 Visual Studio 的一部分,以便直接在 Visual Studio IDE 中生成 WiX 項目。VS擴展程序也可在官網下載。 另一種是在命令行上使用 WiX 工具。本文僅介紹WIX在命令行上的使用。
  WiX 的源代碼是使用 XML 格式編寫的,后綴名一般為 .wxs。該文件相當於安裝包的描述文件,描述了軟件的安裝信息,包括GUID、版本號、功能模塊、安裝文件及路徑等等。安裝包的生成過程類似於源代碼生成可執行程序的過程,經歷預處理、編譯與鏈接。

初識WIX

  WIX軟件正常安裝就可以,在此就不介紹了。

  WIX使用XML源文件來描述安裝內容,我們先來了解一下它的格式。先上一個簡單的例子。

<?xml version="1.0" encoding="utf-8"?>

<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
  <Product Id="*" Name="test" Language="1033" Version="1.0.0.0" Manufacturer="HP Inc." UpgradeCode="35debc95-0757-4f41-b6fb-53f9e5a599d9">
    <Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine"/>
    <MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed."/>
    <MediaTemplate EmbedCab="yes"/>
    <UIRef Id="WixUI_Mondo"/>
    <UIRef Id="WixUI_ErrorProgressText"/>
    <Feature Id='Complete'  Title="test" Level='1' Description='The complete package.' Display='expand' ConfigurableDirectory='INSTALLDIR'>
      <Feature Id="MainProgram" Title="Main Program" Description='The main executable.' Level="1">
        <ComponentGroupRef Id="MainProgram"/>
      </Feature>
      <Feature Id="UserGuide" Title="User Guide" Description="The user guide." Level="1000">
        <ComponentRef Id="UserGuide"/>
      </Feature>
    </Feature>    
  </Product>
  <Fragment>
    <Directory Id="TARGETDIR" Name="SourceDir">
      <Directory Id="ProgramFilesFolder">
        <Directory Id="ManufacturerDir" Name="HP">
          <Directory Id="INSTALLDIR" Name="test"/>
        </Directory>
      </Directory>
      <Directory Id="ProgramMenuFolder" Name="Programs">
        <Directory Id="ProgramMenuDir" Name="test"/>
      </Directory>
      <Directory Id="DesktopFolder" Name="Desktop"/>
    </Directory>
  </Fragment>
  <Fragment>
    <ComponentGroup Id="MainProgram">
      <Component Id="MainExecutable" Directory="INSTALLDIR" Guid="5F2EB9AE-30ED-4D77-9860-E1BA27369FFC">
        <File Id="TestEXE" Name="test.exe" Source="test.exe" KeyPath="yes">
          <Shortcut Id="StartmenuTest" Directory="ProgramMenuDir" Name="test" WorkingDirectory="INSTALLDIR" Advertise="yes"/>
          <Shortcut Id="DesktopTest" Directory="DesktopFolder" Name="test" WorkingDirectory="INSTALLDIR" Advertise="yes"/>
        </File>
      </Component>
      <Component Id="MsvcrLibrary" Directory="INSTALLDIR" Guid="248E920F-A3DF-4EBE-9ACE-14C20E2624DB">
        <File Id="MsvcrDLL" Name="msvcr120.dll" Source="msvcr120.dll" KeyPath="yes"/>
      </Component>
      <Component Id="CompProgramMenuDir" Directory="ProgramMenuDir" Guid="D42B8DC0-576A-47E9-B016-95847D454DC8">
        <Shortcut Id="UninstallProduct" Name="Uninstall" Directory="ProgramMenuDir" Target="[SystemFolder]msiexec.exe" Arguments="/x [ProductCode]" Description="Uninstall"/>
        <RemoveFolder Id='ProgramMenuDir' On='uninstall' />
        <RegistryValue Root='HKCU' Key='Software\[Manufacturer]\[ProductName]' Type='string' Value='' KeyPath='yes' />
      </Component>
    </ComponentGroup>
    <Component Id="UserGuide" Directory="INSTALLDIR" Guid="A1583723-AD99-4D14-8C7C-875517EEB395">
      <File Id="UserGuide" Name="user guide.txt" Source="user guide.txt" KeyPath="yes">
        <Shortcut Id="StartMenuUserGuide" Directory="ProgramMenuDir" Name="User guide" Advertise="yes"/>
      </File>
    </Component>
  </Fragment>
</Wix>

 

  在這個例子中,實現將一個包含三個文件(test.exe,msvcr120.dll,user guide.txt)的程序打包。我們來看一下 test.wxs 文件都包含了哪些內容:

  • Product:是發布的產品的基本信息,主要有Id,Language等屬性。

    Name:產品名稱

    Id:產品的GUID,GUID可以借助VS-->工具--->創建GUID 來生成;也可通過vbs來獲得:Wscript.Echo CreateObject("Scriptlet.TypeLib").Guid

    Language:指所在地區使用的語言,為數字編號。英語為1033,中文簡體為2052

    Version:版本號

    Manufacturer:制作廠商     

    UpgradeCode:產品更新的GUID 

    • Package:記錄一些安裝包的信息
      • InstallerVersion:安裝此安裝包需要的最小Windows Installer版本
      • Compressed: 這個為Yes 表示在源文件中含有壓縮文件
      • InstallScope: 值為枚舉類型,字面意思為安裝范圍,值必須是perMachine 或者 perUser.
    • MajorUpgrade:支持防降級安裝  
    • MediaTemplate: 設置介質屬性。設置EmbedCab="yes"會把.cab文件合並到msi中,不設置的話會多出一個.cab后綴的文件。
    • UIRef:UI風格。WiX工具集附帶了一個標准的用戶界面庫,有五種不同的風格,分別是:WixUI_Mondo,WixUI_FeatureTree,WixUI_InstallDir ,WixUI_Minimal 和 WixUI_Advanced 

    • Feature:定義安裝的部件,可以將不同用處的安裝文件放到不到的Feature部件中。它是可安裝的最小單元。 子元素主要有ComponentRef和ComponentGroupRef,它們和Fragment中的Component和ComponentGroup相對應 。 
      • Level:該功能的安裝級別。當安裝程序運行時,將有一個名為INSTALLLEVEL的預制屬性,其值可以在1到32767之間。如果某個功能的級別為非零且不高於INSTALLLEVEL的當前值,則將安裝該功能。在WIX的界面中,對於典型的安裝,INSTALLLEVEL設置為3,對於完整的安裝,置為1000
      • Display:設置界面中Feature樹是折疊、展開還是不顯示
      • ConfigurableDirectory:設置INSTALLDIR為初始安裝路徑,並允許用戶修改
  • Fragment:代碼片段。我理解是將一些具體的描述放入其中。一般至少有兩個Fragment塊。一個包含Directory,一個包含Component或ComponentGroup,前者指的是安裝目錄,后者指的是組件或組件集合。
    • Directory:使用嵌套的結構描述文件夾的層次。從最外面的文件夾開始,即整個安裝的根目標文件夾,它有一個預定義的TARGETDIR標識符,它將被設置為源文件的根目錄,該根目錄還具有一個預定義的名稱:SourceDir。安裝程序環境還為其它幾個常用的路徑提供了預定義的名稱,允許我們非常容易地引用它們,比如:ProgramFilesFolder、ProgramMenuFolder和DesktopFolder。
    • ComponentGroup和Component:組件的概念及其使用規則可能是Windows安裝程序技術中最重要的概念。組件是要安裝的原子單位。它由資源(文件、注冊表項、快捷方式或其他任何東西)組成,這些資源應始終作為一個單元安裝。安裝組件不應影響其他組件,刪除一個組件不應損壞另一個組件,因此,同一位置的同一個文件不能包含在多個組件中。

  對於標簽中的各個屬性就不一一說明了,另外一些很有用的標簽(比如:Condition,Property,RegistryKey),感興趣可以慢慢研究。

打包

  當 test.wxs 文件准備好之后,就可以進行程序打包了。WIX的工具集提供了很多命令,一般來說下面兩個命令用得最多的。

candle.exe test.wxs

  執行上述命令會生成test.wixobj文件,其實該文件仍然是XML格式,把它理解為中間態的目標文件就行。

light.exe -ext WixUIExtension test.wixobj

  light命令會將中間態的目標文件轉化成安裝包,上述命令會生成test.msi文件。(由於使用了WIXUI,所以要加上 -ext WixUIExtension 參數)

  candle和light相當於執行編譯和鏈接操作。

  至此,一個簡單的安裝程序就制作完成了。 

    


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM