65.9K
CodeProject 正在变化。 阅读更多。
Home

WIX 用于安装数据库

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.92/5 (14投票s)

2012年2月20日

CPOL

11分钟阅读

viewsIcon

89368

downloadIcon

3339

WIXDataBase

引言

如果没有自动安装过程的安装程序,部署阶段可能会很混乱。安装数据库脚本时,问题更加复杂,通常会提供 *.sql 文件。其中一些脚本需要手动修改以适应执行它们的环境。在本文中,我们将介绍如何使用 WiX 和 Visual Studio .NET 创建安装程序 *.MSI,以自动部署 SQL Server 数据库脚本。

使用 WIX 安装应用程序

  • WiX 代码是“开源”的,可以免费使用。它是一个 Windows Installer XML 工具包,其功能包括:
  • 您可以创建可执行的 Setup.exe、安装程序 *.msi、合并模块 *.msm 和服务包 *.msp。
  • 可从命令行或 Visual Studio .NET 使用的工具
  • 包括用于安装 IIS 网站、创建 SQL Server 数据库的扩展。
  • 在运行时下载并安装先决条件,例如 .NET Framework
  • 您可以使用 C#、VB 和 C++ 等语言编写代码。表单可以使用 WiX 或任何这些语言进行开发。

必备组件

安装 WIX 3.6 Beta

在开始下载和安装 WiX 3.6 Beta 之前,如果您在阅读文档时发现有版本,我建议您使用它,因为这是 beta 版本,预计将在 2012 年发布新版本。

数据库解决方案

先前已使用 SQL Server Management Studio 创建了一个数据库解决方案。脚本包含变量,这些变量将在运行安装程序时由用户提供的数据替换。数据库解决方案位于路径

\WixTutor\Script\Wix.DBScript\Wix.DBScript.ssmssln

  • $(DATABASE_NAME): 数据库名称
  • $(DATABASE_PATH_PRIMARY): 数据库主文件 *.mdf 的路径。
  • $(DATABASE_PATH_LOG): 日志文件 *.ldf 的路径。

在 Visual Studio .NET 中创建 WIX 应用程序

最后可以找到有关使用 WiX 的手册和教程的链接。WiX 安装程序包含一个 CHM 格式的帮助文档。本文档描述了如何使用 Visual Studio .Net 2010 创建数据库安装程序。

创建 WIX 项目

  1. 打开 Visual Studio .Net 2010(如果您有较低版本,过程类似)
  2. 点击菜单 文件,新建,项目
    1. 在左侧选择模板“Windows Installer XML”
    2. 在中间面板选择模板“Setup project”
    3. 在文本框中输入名称:WixDataBase.Setup
    4. 在文本框“Location”中选择安装路径,在本示例中路径为:\WixTutor\Fuentes
    5. 按确定

image001.jpg

WIX 项目中的引用

向项目添加以下引用,程序集位于类似路径下

C:\Program Files\Windows Installer XML v3.6\bin\

名称 文件
WixNetFxExtension WixNetFxExtension.dll
WixUIExtension WixUIExtension.dll
WixUtilExtension WixUtilExtension.dll

命名空间

在产品 XML 文件中,您可以添加命名空间

 
<p class="MsoNormal" align="left" style="text-align: left; text-autospace: none">
    <Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"

    xmlns:util="http://schemas.microsoft.com/wix/UtilExtension"

    xmlns:netfx="http://schemas.microsoft.com/wix/NetFxExtension">

包含

安装程序的所有配置都可以写在 Product.wxs 文件中。为了改进维护性,请创建单独的文件并在主文件 Product.wxs 中添加引用。在项目中,我们添加了以下类型的文件:

文件类型 描述 示例
WiX 文件 Wix 文件片段,可以从其他 *.WXS 文件引用。引用片段的属性时,将包含 *.WXS 的全部内容 Components.wxs
WiX 包含 包含文件的全部内容将被插入到另一个文件中。 Variables.wxi
WiX 本地化 设置文本以本地化特定区域的元素。 Loc_es.wxl

完整的 WiX 文件类型列表可在以下网址找到:http://wix.sourceforge.net/manual-wix3/files.htm

GUID

使用 GUID 标识产品、组件和其他元素。此代码可以由系统自动生成,但最好生成标识符以避免与其他应用程序和安装程序冲突,从而执行下一个版本或服务包。

可以在 Visual Studio .Net 中从 **工具** 菜单,“**创建 GUID**”来创建 GUID。WiX 允许使用括号或不使用括号书写。

Guid="{7501E95A-59E5-41B7-86D6-A5D0910356FC}"
Guid="7501E95A-59E5-41B7-86D6-A5D0910356FC"

变量

用于设置属性的变量。WiX 项目包含引用 VS .Net 的变量,变量列表可在

http://wix.sourceforge.net/manual-wix3/votive_project_references.htm

变量列表中包括产品元数据、GUID 标识符(每个不同产品都需要修改这些)、要安装文件的路径,在本例中是数据库脚本。项目中使用的变量位于 Variables.wxi 文件中。

<?xml version="1.0" encoding="iso-8859-1"?>
<Include>
  <?define ProductId = "{EAE3B0D1-5711-4CB0-BDB0-B49EC0CFE5FA}" ?>
  <?define ProductName = "WixDataBase.Setup" ?>
  <?define ProductVersion = "1.0.0.0" ?>
</Include>

由于变量是在 Include 块中创建的,因此在 *.WXS 文件中需要使用变量来添加以下行:

<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" ... >
  <?include $(var.ProjectDir)\Includes\Variables.wxi ?>
</Wix>

Propertys

属性可用于:检索用户信息、设置产品属性、定义先决条件(如 Microsoft Framework 版本)、更改对话框背景等。属性值可以写入系统注册表(供后续安装查询)、从磁盘路径恢复、从配置文件读取或在 WiX 中使用托管代码创建的 CustomAction 中设置。

表格

在此示例中,我们使用一个表来定义数据库文件的安装路径。

<CustomTable Id="TABLE_DATABASE_PATHS">
  <Column Id="Name" Type="string" PrimaryKey="yes"/>
  <Column Id="Description" Type="string"/>
  <Column Id="Path" Type="string" Nullable="yes"/>

  <Row>
    <Data Column="Name">DATABASE_PATH_PRIMARY</Data>
    <Data Column="Description">!(loc.Database_Path_Primary)</Data>
    <Data Column="Path"></Data>
  </Row>
  <Row>
    <Data Column="Name">DATABASE_PATH_LOG</Data>
    <Data Column="Description">!(loc.Database_Path_Log)</Data>
    <Data Column="Path"></Data>
  </Row>
</CustomTable>
<EnsureTable Id="TABLE_DATABASE_PATHS"/>

条件

可以使用条件来评估先决条件,例如用户对本地计算机、框架等具有管理员权限。条件有一个 message 属性,当条件评估为 false 时会显示给用户。条件在文件:Conditions.wxs 中。

<Condition Message="!(loc.ValidationDotNet)">
<br>  <![CDATA[Installed OR (NETFRAMEWORK30 OR NETFRAMEWORK35 OR NETFRAMEWORK40CLIENT OR NETFRAMEWORK40FULL)]]>

</Condition>

Custom Actions

操作是当条件评估为 true 时要执行的任务,操作可以使用托管代码创建。自定义操作位于文件:CustomAction.wxs 中。

Windows Installer 包含一组预定义的操作:http://msdn.microsoft.com/en-us/library/Aa372023

操作的执行顺序在部分:<InstallExecuteSequence> 中设置。

AppSearch
LaunchConditions
ValidateProductID
CostInitialize
FileCost
CostFinalize
InstallValidate
InstallInitialize
ProcessComponents
UnpublishFeatures
RemoveShortcuts
RemoveFiles
InstallFiles
CreateShortcuts
RegisterUser
RegisterProduct
PublishFeatures
PublishProduct
InstallFinalize
RemoveExistingProducts

操作顺序可在 Orca 应用程序中找到:http://wix.tramontana.co.hu/tutorial/events-and-actions/queueing-up

要安装的组件

WiX 提供了用于任务的工具,例如创建 *.WXS 文件,其中包含要安装的文件列表。

http://wix.sourceforge.net/manual-wix3/AllTools.htm
http://wix.sourceforge.net/manual-wix3/heat.htm

在此项目中,我们使用 Harvest Tool (Heat),这是一个命令行实用程序,它使用磁盘路径或 Visual Studio .Net 路径来生成组件列表。

为了简化过程,创建了一个批处理文件。

\WixTutor\Fuente\WixDataBase.Setup\WixDataBase.Setup\Bats\Wix_Components.bat

@ECHO off
"%WIX%bin\heat.exe" dir "D:\Hugo\Proyectos\WixTutor\Script\Wix.DBScript" -cg CG_General -out Components_Dir.wxs -dr INSTALLLOCATION -gg -var var.SourceItemsDir -template product
"%WIX%bin\heat.exe" project "D:\Hugo\Proyectos\WixTutor\Fuente\WixDataBase.Setup\WixDataBase.CustomAction\WixDataBase.CustomAction.csproj" -pog Binaries -pog Documents -pog Satellites -cg CG_General -out Components_Project.wxs -dr INSTALLLOCATION -gg -var var.SourceItemsDir -template product
ECHO Presione una tecla para terminar ...
PAUSE
@ECHO on

在批处理文件中,有一个由 WiX 安装程序生成的 %WIX% 环境变量。在批处理文件中,替换使用 SQL Server Management Studio 创建的数据库解决方案的相应路由。

双击批处理文件会创建两个文件:Components_Project.wxs 和 Components_Dir.wxs。

以下链接解释了如何创建组件:

http://wix.tramontana.co.hu/tutorial/com-expression-syntax-miscellanea/components-of-a-different-color

创建不安装文件的目录

http://wix.tramontana.co.hu/tutorial/com-expression-syntax-miscellanea/creating-directories

您可以使用系统目录来安装组件。

http://msdn.microsoft.com/en-us/library/aa372057.aspx

Heat.exe 工具会生成一个文件,进行更改以使目录结构和用户功能呈现更清晰。更改将包括替换元素代码,使用标准约定,组件位于文件:Components.wxs 中。

示例目录树

<Directory Id="TARGETDIR" Name="SourceDir">
  <Directory Id="$(var.PlatformProgramFilesFolder)">
    <Directory Id="INSTALLLOCATION" Name="$(var.ProgramFileFolderName)" >
      <Directory Id="D_Wix.DBScript" Name="Wix.DBScript">
        <Directory Id="D_A01Wix.CreateDB" Name="A01Wix.CreateDB" />
        <Directory Id="D_A02Wix.Audit.DB" Name="A02Wix.Audit.DB" />
        <Directory Id="D_B01Wix.Data" Name="B01Wix.Data" />
        <Directory Id="D_C01Wix.Security" Name="C01Wix.Security" />
        <Directory Id="D_D01Wix.SQLAgent" Name="D01Wix.SQLAgent" />
      </Directory>
    </Directory>
  </Directory>
  <Directory Id="ProgramMenuFolder">
    <Directory Id="D_AppShortcut" Name="$(var.ProgramFileFolderName)" />
  </Directory>
</Directory>
示例组件
<ComponentGroup Id="CG_A01Wix.CreateDB">
 <Component Id="cmp8ED399792B183E6A39CDE32ED8BC95F9" Directory="D_A01Wix.CreateDB" Guid="{835F8A93-8280-4A88-B34C-DE731D1D6F44}">
  <File Id="fil25044444B3C75610A43228F06F2B92B5" KeyPath="yes" Source="$(var.SourceItemsDir)\A01Wix.CreateDB\A01Wix.CreateDB.ssmssqlproj" />
 </Component>
 <Component Id="cmpC71BE0DCE33A3995A07ED8CDFB9A4F81" Directory="D_A01Wix.CreateDB" Guid="{BB80C594-9F48-4C99-A936-31A704C1F2A8}">
  <File Id="filCA369E782AB7B12498A20FC9C89FB7B4" KeyPath="yes" Source="$(var.SourceItemsDir)\A01Wix.CreateDB\Wix_01CreateDB.sql" />
 </Component>
 <Component Id="cmp93BF8C538A6DD6C305F1653FA928DC30" Directory="D_A01Wix.CreateDB" Guid="{0A6B283C-547D-486F-A8E4-C58628EFA31A}">
  <File Id="fil410E66D681B6D7C677FE038E251CD31C" KeyPath="yes" Source="$(var.SourceItemsDir)\A01Wix.CreateDB\Wix_02Schema.sql" />
 </Component>
</ComponentGroup>
示例功能
<Feature Id="F_A01Wix.CreateDB"
         Title="!(loc.F_A01Wix.CreateDB.Title)"
         Level="1"
         Description="!(loc.F_A01Wix.CreateDB.Description)"
         ConfigurableDirectory="INSTALLLOCATION"
         AllowAdvertise="no">
  <ComponentGroupRef Id="CG_A01Wix.CreateDB" />
  <ComponentGroupRef Id="CG_A02Wix.Audit.DB" />
  <ComponentGroupRef Id="CG_B01Wix.Data" />
  <ComponentGroupRef Id="CG_C01Wix.Security" />
</Feature>

功能有一个 Level 属性,其中零表示安装,等于 1 表示功能默认显示为活动状态。当用户需要安装一个功能时,设置一个更高的值,例如 100,并添加一个属性,该属性表示默认勾选级别小于或等于 3 的功能。

<Property Id="INSTALLLEVEL">3</Property>

image002.jpg

5.6 向导和对话框

要使用 WiX 对话框,必须添加对 WiX 程序集的引用。默认情况下,WiX 序列组织对话框和向导。这些向导只能通过向产品添加引用来使用:

<UIRef Id="WixUI_Mondo" />
• WixUI_Mondo
• WixUI_FeatureTree
• WixUI_InstallDir
• WixUI_Minimal
• WixUI_Advanced

要修改许可证文件、图标、壁纸和横幅,请设置以下属性:

<!-- 493 x 312 pixels-->
<br><WixVariable Id="WixUIDialogBmp" Value="$(var.ProjectDir)\Imag\DialogBmp.bmp" />

<!-- 493 x 58 pixels-->

<WixVariable Id="WixUIBannerBmp" Value="$(var.ProjectDir)\Imag\BannerBmp.bmp" />

要更改执行顺序或自定义对话框,已从 WiX 的原始源文件复制文件。为避免冲突,已重命名对话框和向导,例如,将 WixUI2_Mondo 重命名为 WixUI_Mondo。在项目中,您可以在以下路径找到复制和修改的项目:

\WixTutor\Fuente\WixDataBase.Setup\WixDataBase.Setup\Dialogs\WixDialogs

WiX 文件位于类似以下路径的源文件中:

\wix36-sources\src\ext\UIExtension\wixlib\

也可以在以下路径找到:http://wix.cvs.sourceforge.net/viewvc/wix/wix/src/ext/UIExtension/wixlib/

为了提示用户提供运行数据库脚本所需的数据,创建了 WiX 对话框。为了请求安装路径,创建了一个 Windows 窗体,用于包含托管代码中的自定义操作的类库项目。

<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"><br>  <?include $(var.ProjectDir)\Includes\Variables.wxi ?>

   <Fragment>

     <UI>

       <Dialog Id="DatabaseServerDlg" />

       <Dialog Id="DatabaseSQLAgentDlg" />

       <Dialog Id="DatabaseProxyDlg" />

     </UI>

  </Fragment>

</Wix>

image003.jpg

Location

安装程序可以显示多种语言的消息,为此,它会创建一个文件夹结构并组织文件的位置。对话框的位置可以从 WiX 源文件复制。

\wix36-sources\src\ext\UIExtension\wixlib\

或在此链接:http://wix.cvs.sourceforge.net/viewvc/wix/wix/src/ext/UIExtension/wixlib/

构建时,会为每个位置生成一个文件夹,其中包含安装文件:*.msi。要为单一区域设置编译,请在项目属性窗口 WixDataBase.Setup 的“构建”页面中,在“要构建的区域”文本框中输入区域。

Custom Actions amd Forms .NET

在 Visual Studio .Net 中,创建安装程序将运行的任务,例如:安装 Windows 服务、Web 服务、运行数据库脚本、Power Shell 等。我们还可以创建比使用 WiX 更复杂的表单。

要添加自定义操作,请执行以下操作:

  1. 右键单击“解决方案资源管理器”面板,选择“添加”,“新建项目”。
  2. 在左侧选择模板“Windows Installer XML”,在右侧选择“C# Custom Action Project”。
  3. 在文本框中输入名称:WixDataBase.CustomAction
  4. 按“确定”。
  5. 向项目添加以下引用:
    • System.Data
    • System.Drawing
    • System.Transactions
    • System.Windows.Forms
  6. 创建公共类并添加用 [CustomAction] 属性修饰的静态方法。您可以创建组织在单独类中的方法,类名无关紧要,WiX 负责查找合适的方法。
  7. 在 WiX 项目中添加对所添加库的引用。

image004.jpg

在 WiX 项目的 CustomAction.wxs 文件中,操作的执行声明如下:

<CustomAction Id="CA_DataBaseTestConnection" BinaryKey="BIN_CustomAction" DllEntry="TestSqlConnection" Execute="immediate" Impersonate="yes" Return="ignore" />

CustomAction Execute 有一个重要属性,它可以取以下值:

描述
Immediate 在用户界面序列中执行
Deferred 在执行序列中执行

image005.jpg

执行序列

对话框的执行顺序在文件:WixUI3_Mondo.wxs 中定义。

<UI Id="WixUI3_Mondo">
<br>  <Publish Dialog="UI2WelcomeDlg" Control="Next" Event="NewDialog" Value="UI2LicenseAgreementDlg">NOT Installed AND NOT PATCH</Publish>

</UI>

此片段指示按下 UI2WelcomeDlg 对话框的“下一步”按钮后要执行的操作,显示 UI2LicenseAgreementDlg 对话框,并添加了一个条件,该条件仅在产品已安装且不是服务包时显示对话框。

要在 Product.wxs 文件中使用此序列,请添加一个引用。

<UIRef Id="WixUI3_Mondo" />

安装过程有两个阶段:用户界面序列和执行序列。在用户界面序列中,显示对话框以供用户设置实施选项,而在实施阶段执行任务。

<InstallUISequence>
<br>  <Show Dialog="UI2ExitDlg" OnExit="success" />

</InstallUISequence>



<InstallExecuteSequence>

  <Custom Action="CA_DataBaseSwhowPathInstall" Before="InstallFinalize">

    <![CDATA[DATABASE_EXECUTESCRIPTS = "1" AND (NOT INSTALLED OR UPGRADINGPRODUCTCODE OR NOT (REMOVE="ALL"))]]>

  </Custom>

</InstallExecuteSequence>

产品

Product.wxs 文件是安装程序的核心,它包含指向单独文件的指针,并设置显示消息的位置代码。我们使用变量、属性和本地化来设置值,而不是直接写入值。

构建和调试

构建

编译时可能会收到 ICE## 错误,这些是由 Windows Install 生成的错误,例如下面提到的错误需要修改 WiX。

ICE20: 标准对话框:未找到“FilesInUse”

要修复,请执行以下操作:

  1. 打开项目 WixDataBase.Setup 的属性窗口。
  2. 选择“工具设置”页面。
  3. 在“抑制特定 ICE 验证”文本框中写入:ICE20。

image006.jpg

编译时会为每个区域创建一个文件夹,其中包含安装文件:*.msi。

调试自定义操作

要调试,您必须编译并运行安装程序 WixDataBase.Setup.msi。添加临时对话框以在托管代码开始执行之前暂停安装程序,从 Visual Studio 的 Debug 菜单中,选择“附加到进程”,附加到进程:msiexec.exe 和 rundll32.exe。

MessageBox.Show("ExecuteSQLScripts: For debug in VS .Net, in menu Debug, 'Attach to process' attacha process: msiexec.exe y rundll32.exe.",
"DEBUG: ExecuteSQLScripts", MessageBoxButtons.OK, MessageBoxIcon.Information);

要调试,请参阅:http://blog.torresdal.net/CommentView,guid,BFEBE347-AD82-4C76-A96E-1C22AA39EFC9.aspx

安装、卸载和添加功能

要安装,请双击文件 WixDataBase.Setup.msi。要修改安装窗口,请使用 Windows 控制面板中的“添加/删除程序”。

关注点

Visual Studio .Net 附带的安装程序在创建自定义对话框方面存在限制。WiX 可以使用 XML 对话框或使用 Visual Studio .NET 等语言进行创建。

WiX 是部署阶段的一个好工具,免费且灵活。它允许自定义安装,并与 Visual Studio .Net 托管代码结合使用。您还可以创建服务包。

会显示一个进度条,显示数据库脚本安装的进度。

WiX 的一个缺点是它在自定义操作之间传递数据时存在困难。为克服此困难,您可以编写回溯代码并在不同自定义操作之间传递变量,也可以使用系统注册表传递信息,但这很麻烦。

附录

历史

版本 1.0.0。创建日期:2012-02-13

© . All rights reserved.