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 detected
3) 如何在安裝時設定系統資料庫和環境變量
設定系統資料庫: <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"> 這樣解除安裝或者其他操作時,目前安 裝的檔案正在被使用時會出現提示框,要求使用者選擇操作