天天看點

利用WIX制作安裝包(1)

原文  利用WIX制作安裝包(1)

#installation

下載下傳最新版本的WIX toolset 并安裝

DOWNLOAD

Wix toolset V3.5之後的版本已經可以內建到visual studio,我們可以直接在vs中編寫代碼,并借助vs進行編譯。

#demo

首先打開 Visual Studio,然後選擇建立WIX Setup Project. 建立完成之後的在項目中我們可以看到一個名為

Product.wxs

的檔案,其代碼如下:

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Product Id="*" Name="SetupProject1" Language="1033" Version="1.0.0.0" Manufacturer="" UpgradeCode="8e1efb05-1e12-40e5-abca-c8bd7965bf2a">
        <Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" />

        <MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
        <MediaTemplate />

        <Feature Id="ProductFeature" Title="SetupProject1" Level="1">
            <ComponentGroupRef Id="ProductComponents" />
        </Feature>
    </Product>

    <Fragment>
        <Directory Id="TARGETDIR" Name="SourceDir">
            <Directory Id="ProgramFilesFolder">
                <Directory Id="INSTALLFOLDER" Name="SetupProject1" />
            </Directory>
        </Directory>
    </Fragment>

    <Fragment>
        <ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER">
            <!-- TODO: Remove the comments around this Component element and the ComponentRef below in order to add resources to this installer. -->
            <!-- <Component Id="ProductComponent"> -->
                <!-- TODO: Insert files, registry keys, and other resources here. -->
            <!-- </Component> -->
        </ComponentGroup>
    </Fragment>
</Wix>           

屬性介紹:

1. UpgradeCode 标簽中的 UpgradeCode 是産品的版本id。産品的更新解除安裝全部要用到它,一旦指定之後就不要修改。
 2. product标簽中的 id 是該産品目前版本的id。它每次在更新版本的時候都需要改變。
 3. Directory 定義産品安裝目錄的目錄結構
 4. Feature 産品的功能清單
 5. MajorUpgrade 防止産品降級安裝。
 6. Manufacturer 公司或者組織名稱           

#file

項目建立完成之後,我們需要往安裝包裡面添加檔案。WIX添加檔案的方法很友善,直接使用

<File Source="檔案路徑" />

 就可以把一個檔案添加到安裝包中來。

檔案路徑

 可以用絕對路徑和相對路徑來表示,在Wix中相對路徑的可能需要用到變量。例如:

$(var.ReferencedProjectName.TargetDir) 表示項目中引用的另一項目‘ReferencedProjectName‘的輸出路徑

$(env.WIXPATH) 表示系統的環境變量WIXPATH所指向的路徑。

關于其它的表示方法請大家參閱官網。           

在這裡我們在項目中添加一個檔案夾

resource

 , 并在這個檔案夾下添加一個

TextFile1.txt

,然後在上述代碼中的

//todo

注釋的下面添加如下代碼

<Component Id="ProductComponent" Guid="7B428173-1277-482B-BC2E-CC008F3B79F9">
    <File Source="resource/TextFile1.txt" />
</Component>           

然後指定

Manufacturer

 後就進行編譯,編譯成功之後進行安裝,之後大家在

c:/programfiles(X86)/SetupProject1

 的目錄下就可以看到

TextFile1.txt

 檔案了。就這樣一個簡單的安裝包就制作成功了。 但是這一一個簡單的安裝包絕對不能滿足我們日常的工作需要。下面我将為大家介紹如何實作一些另外的操作

#directory

自定義安裝目錄結構。修改directory結構目錄為如下

<Fragment>
    <Directory Id="TARGETDIR" Name="SourceDir"
        <Directory Id="ProgramFilesFolder">
            <Directory Id="INSTALLFOLDER" Name="SetupProject1">
                <Directory id="LOG" name="log"/>
                <Directory id="DATA" name="data"/>
            </Directory>
        </Directory>
    </Directory>
    </Fragment>           

然後重新編譯安裝。就會發現安裝之後的目錄結構已經變成了如下

-ProgramFiles(x86)
    --SetupProject1
    ---log
    ---data           

#ui

WIX預設為我們提供了五種UI類型。關于每種UI的樣式。請大家自己嘗試或者檢視文檔。

  1. WixUI_Advanced Dialog Set
  2. WixUI_FeatureTree Dialog Set
  3. WixUI_Minimal Dialog Set
  4. WixUI_Mondo Dialog Set
  5. WixUI Dialogs

如果我們要引用任一UI,我們隻需要在

product.wxs

 檔案中添加如下代碼

<UIRef id="WixUI_Advanced"/>           
  • 1

然後編譯運作,就會看到UI已經發生了改變。如果需要自定義UI則需要重新編寫一個UI,然後添加到

WixUI_Advanced

 的 UI Sequence中去.(請見下一篇)

#action

WIX 允許我們自定義Action。如果需要自定義Custom Action,我們需要另外建立一個類型為

C# Custom Action Project

的項目。建立成功後,在項目中添加一個

CustomAction.cs

 然後編輯代碼如下:

using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.Deployment.WindowsInstaller;

namespace CustomAction1
{
    public class CustomActions
    {
        [CustomAction]
        public static ActionResult CustomAction1(Session session)
        {
            session.Log("Begin CustomAction1");
            return ActionResult.Success;
        }
    }
}           

這樣一個自定義的方法就定義好了。然後編譯項目。該項目編譯成功之後會有兩個輸出檔案

CustomAction.dll

 和 

CustomAction.CA.dll

. 其中以

CA.dll

 結尾的檔案才是我們所需要的檔案。 然後我們把CustomAction項目添加到之前建立的項目的引用中去。然後添加檔案

customAction.wxs

 并添加如下代碼

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Fragment>
    <Binary Id="BINARYFILE" SourceFile="$(var.CustomAction.TargetDir)CustomAction1.CA.dll" />
    <CustomAction Id="CustomAction1" BinaryKey="BINARYFILE" DllEntry="CustomAction1" />
    </Fragment>
</Wix>           

這樣一個CustomAction就建立并引入成功了。下面我們就可以調用這個方法了。在WIX中Action的執行時有順序的。如果我們要添加一個自定義事件,我們必須要指定它在什麼事件之前或者之後執行,見如下代碼,關于WIX的事件順序請參考

事件順序
<InstallExecuteSequence>
    <Custom Action="CustomAction1" After="InstallFiles"/>
  </InstallExecuteSequence>           

上述代碼指定了在

InstallFiles

 方法執行完成之後立馬執行

CustomAction1

. 就這樣,一個自定義的方法就定義成功,并且被成功調用了。

利用自定義的CustomAction我們可以做一些自定義操作。比如寫log檔案或者其它。

下一篇我将為大家介紹如何使用WIX制作自定義界面,并且将自定義界面添加到UI序列中去