WIX 用于安装数据库






4.92/5 (14投票s)
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 项目
- 打开 Visual Studio .Net 2010(如果您有较低版本,过程类似)
- 点击菜单 文件,新建,项目
- 在左侧选择模板“Windows Installer XML”
- 在中间面板选择模板“Setup project”
- 在文本框中输入名称:WixDataBase.Setup
- 在文本框“Location”中选择安装路径,在本示例中路径为:\WixTutor\Fuentes
- 按确定
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.htmhttp://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/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>
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>
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 更复杂的表单。
要添加自定义操作,请执行以下操作:
- 右键单击“解决方案资源管理器”面板,选择“添加”,“新建项目”。
- 在左侧选择模板“Windows Installer XML”,在右侧选择“C# Custom Action Project”。
- 在文本框中输入名称:WixDataBase.CustomAction
- 按“确定”。
- 向项目添加以下引用:
- System.Data
- System.Drawing
- System.Transactions
- System.Windows.Forms
- 创建公共类并添加用 [CustomAction] 属性修饰的静态方法。您可以创建组织在单独类中的方法,类名无关紧要,WiX 负责查找合适的方法。
- 在 WiX 项目中添加对所添加库的引用。
在 WiX 项目的 CustomAction.wxs 文件中,操作的执行声明如下:
<CustomAction Id="CA_DataBaseTestConnection" BinaryKey="BIN_CustomAction" DllEntry="TestSqlConnection" Execute="immediate" Impersonate="yes" Return="ignore" />
CustomAction Execute 有一个重要属性,它可以取以下值:
值 | 描述 |
Immediate | 在用户界面序列中执行 |
Deferred | 在执行序列中执行 |
执行序列
对话框的执行顺序在文件: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”
要修复,请执行以下操作:
- 打开项目 WixDataBase.Setup 的属性窗口。
- 选择“工具设置”页面。
- 在“抑制特定 ICE 验证”文本框中写入:ICE20。
编译时会为每个区域创建一个文件夹,其中包含安装文件:*.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 的一个缺点是它在自定义操作之间传递数据时存在困难。为克服此困难,您可以编写回溯代码并在不同自定义操作之间传递变量,也可以使用系统注册表传递信息,但这很麻烦。
附录
- WiX 主页:http://wix.sourceforge.net/index.html
- 下载 WiX:http://wix.codeplex.com/
- WiX XML 编辑器:http://wixedit.sourceforge.net/
- WiX 扩展:http://msiext.codeplex.com/
- 教程:http://wix.tramontana.co.hu/
- 手册:http://wix.sourceforge.net/manual-wix3/main.htm
- 技巧:http://www.stackprinter.com/export?service=stackoverflow&question=471424&printer=false&linktohome=true
- 与 VS .Net 集成(Votive):http://wix.sourceforge.net/votive.html
- 使用 WiX 创建 Web 应用程序:http://blogs.planetsoftware.com.au/paul/archive/2011/02/05/using-wix-3.5-with-visual-studio-2010.aspx
- Wix - 问题解答:http://www.codingquestion.info/wix/5/taglist
- 如何:安装完成后运行已安装的应用程序:http://wix.sourceforge.net/manual-wix3/run_program_after_install.htm
- 从 MSI 到 WiX:http://blogs.technet.com/b/alexshev/archive/2008/02/10/from-msi-to-wix.aspx
- 从 MSI 到 WiX,第 25 部分 - 可安装项 - 使用 XmlFile 更新 XML 文件:http://blogs.technet.com/b/alexshev/archive/2009/05/27/from-msi-to-wix-part-25-installable-items-updating-xml-files-using-xmlfile.aspx
- 使用 .Net 代码创建自定义操作:http://community.saasgrid.com/developers/b/team/archive/2011/02/17/wix-managed-custom-actions-openfiledialog-example.aspx
- wixcustomaction.aspx
- 使用 Orca 编辑 Windows Installer 文件:http://support.microsoft.com/kb/255905/es
历史
版本 1.0.0。创建日期:2012-02-13