1) 安装卸载时进行日志记录
Wix 制作的 Installer 的调试很麻烦,没有直接的 Bug 工具,可以通过记录安装日志的方式进行间接调试。命令为 msiexec /i package.msi /l log.txt
详细参考: msiexec /Option <Required Parameter> [Optional Parameter] 安装选项 </package | /i> <Product.msi> 安装或配置产品 /a < Product.msi> 管理安装 - 在网络上安装产品 /j<u|m> <Product.msi> [/t <Transform List>] [/g <Language ID>] 播发产品 - m 播发到所有用户, u 播发到当前用户 </uninstall | /x> <Product.msi | ProductCode> 卸载产品 显示选项 /quiet 安静模式,无用户交互 /passive 无从参与模式 - 只显示进程栏 /q[n|b|r|f] 设置用户界面级别 n - 无用户界面 b - 基本界面 r - 精简界面 f - 完整界面 ( 默认值 ) /help 帮助信息 重新启动选项 /norestart 安装完成后不重新启动 /promptrestart 提示用户重新启动 ( 如果必要 ) /forcerestart 安装后总是重新启动计算机 日志选项 /l[i|w|e|a|r|u|c|m|o|p|v|x|+|!|*] <LogFile> i - 状态消息 w - 非致命警告 e - 全部错误消息 a - 操作的启动 r - 操作特定记录 u - 用户请求 c - 初始界面参数 m - 内存不足或致命退出信息 o - 磁盘空间不足消息 p - 终端属性 v - 详细输出 x - 额外调试信息 + - 扩展到现有日志文件 ! - 每一行刷新到日志 * - 记录所有信息,除了 v 和 x 选项 /log < LogFile> 与 /l* < LogFile> 相同 更新选项 /update <Update1.msp>[;Update2.msp] 应用更新 /uninstall <PatchCodeGuid>[;Update2.msp] /package < Product.msi | ProductCode> 删除产品的更新 修复选项 /f[p|e|c|m|s|o|d|a|u|v] <Product.msi | ProductCode> 修复产品 p - 仅当文件丢失时 o - 如果文件丢失或安装了更旧的版本 ( 默认值 ) e - 如果文件丢失或安装了相同或更旧的版本 d - 如果文件丢失或安装了不同版本 c - 如果文件丢失或较验和与计算的值不匹配 a - 强制重新安装所有文件 u - 所有必要的用户特定注册表项 ( 默认值 ) m - 所有必要的计算机特定注册表项 ( 默认值 ) s - 所有现有的快键方式 ( 默认值 ) v - 从源运行并缓存本地数据包 设置公共属性 [PROPERTY=PropertyValue]2) 安装默认位置的修改
安装包一般默认安装在系统盘的 Program Files 文件夹下,此文 件在 Wix 中为 ProgramFilesFolder ,使 用形式为: <Directory Id="ProgramFilesFolder"></Directory > 还有很多内置的文件夹描述属 性,比如桌面 ——DesktopFolder 、开始菜单的程序 ——ProgramMenuFolder ,这些都可以直接用。 有时候安装程序限定要装在某个盘 的根目录中,这时候可以用 WindowsVolume 来代替系统盘,但是使用方法上有一定的区别: < SetDirectory Id="WINDOWSVOLUME" Value="[WindowsVolume]"/> < Directory Id="WINDOWSVOLUME"></Directory> 不加上 SetDirectory 会报错,最好加 上。
要想使用自己定义的安装目录, 则要对 Wix 自带 的属性 WIXUI_INSTALLDIR 进行包装。 < Property Id="WIXUI_INSTALLDIR" Value="INSTALLLOCATION" />自定义 CustomAction( 一 )
CustomAction 在 Wix 中扮演着很重要的角色,这里讲讲它的其中一个用途 —— 根据条件设置属性的值。 例子: <Property Id="IDEVC71" Value="not detected"/> < Property Id="VC71PATH"> <RegistrySearch Id="VC71" Type="raw" Root="HKLM" Key="SOFTWARE\Microsoft\VisualStudio\7.1" Name="InstallDir"/> < /Property> < CustomAction Id="MyAction.SetVC71Property" Return="check" Property="IDEVC71" Value="detected">VC71PATH</CustomAction>
用途:一旦在注册表中找到相关 的值,那么属性 IDEVC71 的值将被设为 detected ,否则为 not detected3) 如何在安装时设置注册表和环境变量
设置注册表: <RegistryValue Root="HKCU" Key="Software\Developer" Name="installed" Type="integer" Value="1" KeyPath="yes"/> 设置环境变量:(这里将环境变量的设置作为一个 Component ) <Component Id="ProductEnvironment" Guid="" KeyPath="yes"> <Environment Id='UpdatePath' Name='PATH' Action='set' System='yes' Part='first' Value='[INSTALLLOCATION]bin'/> <Environment Id='SetTclLibraryPath' Name='TCL_LIBRARY' Action='set' System='yes' Part='all' Value='[INSTALLLOCATION]msys\lib'/> < /Component> 前者是添加到系统变量 PATH 中,后者是新建系统环境变量 TCL_LIBRARY
4) 自定义 CustomAction( 二 )
调用本机应用程序: <Property Id="NOTEPAD">Notepad.exe</Property> < CustomAction Id="LaunchReadme" Property="NOTEPAD" ExeCommand="[INSTALLLOCATION]README.txt" Return="asyncNoWait"/> 用途:调用 Notepad 程序(记事本)打开安装目录下的 README.txt 文件。
5) INI 文件的操作
Wix 提供对标准 INI 文件的操作,包括新建、编辑等。 例子: <IniFile Id="WriteIntoFile" Action="addLine" Key="InstallDir" Name="Foobar.ini" Sections="Paths" Value="[INSTALLDIR]"/> 用途:在文件 Foobar.ini 文件中 Paths 段下添加一行 “InstallDir = 安装目录 ” 。 Action 中的操作包括添加、删除、新建等。在实际编写代码时会有自动提示。
6) Heat 的特殊用法
Heat 工具用于 harvest 文件或者文件夹,是比较基础的 Wix 工具,这里讲讲它的一个特殊用法:配合 candle 使用 var 传递参数。 例如: heat.exe dir VC80 -gg -nologo -ke -sfrag -template:fragment -dr INSTALLLOCATION -cg VC80ComponentGroup -var var.VC80Dir -out build\VC80.wxs 用途:将文件夹 VC80 下的所有文件和文件夹打包进 VC80ComponentGroup 里,源文件根目录 SourceDir 用( $var.VC80Dir )代替。 编译的时候使用 candle -dVC80Dir="VC80" 即可,这样就可以同时对不同文件夹下的 文件进行一次性处理。 -d 参数可以有多个,也可以在 light 的时候调用,尝试成功。
7) Wix 自动化 Build 流程
heat
candle
light 目前可以考虑使用基本的 BAT 批处理命令进行自动化的 Build 过程,以后可以考虑引入 Build 系统。
8) 关于 FilesInUse 的使用
Wix 中自带了 FilesInUse 和 MsiRMFilesInUse2 个错误处理的对话框 一般不需要开发人员去处理,只需要在 Install UI Sequence 前引用这两个对话框即可 <DialogRef Id = "FilesInUse"> 这样卸载或者其他操作时,当前安 装的文件正在被使用时会出现提示框,要求用户选择操作