
開發(fā)工具構(gòu)建工具【免費下載鏈接】wix3WiX Toolset v3.x項目地址https://gitcode.com/gh_mirrors/wi/wix3點擊查看免費下載本文基于 WiX Toolset 倉庫中的 lit 官方文檔 展開完整覆蓋 litLibrary Tool的命令行用法與全部參數(shù)并結(jié)合 lit 主程序源碼、Librarian 核心類 與 wixlib 集成測試 深入講解其內(nèi)部工作機制。讀完本文你將掌握如何在 WiX 構(gòu)建流程中用 lit 將多個.wixobj對象文件組合成.wixlib庫、如何配置-bf文件綁定與-loc本地化字符串以及如何在 MSBuild 項目.wixproj中通過Lit任務自動化這一流程。lit 在 WiX 構(gòu)建流程中的位置WiX 的 MSI 構(gòu)建采用“編譯—鏈接”兩階段模型candle.exe負責把.wxs源文件編譯為中間對象文件.wixobjlight.exe負責把多個.wixobj鏈接為最終的.msi。在這兩個工具之間存在一個可選的中間環(huán)節(jié)即 lit.wxs ──candle── .wixobj ──lit── .wixlib ──light── .msiLit 的定位是庫創(chuàng)建工具它把多個.wixobj文件合并為一個.wixlib庫文件這個庫隨后可以作為 light 的輸入被消費。其典型價值在于把一組相關的 WiX 源例如一個可復用的組件集、一個“功能塊”預先組合打包供其他產(chǎn)品包以“庫”的形式引用而無需在 light 階段羅列所有對象文件。這一點可以從源碼的入口注釋直接印證——lit.cs 中的Lit類被標注為 “Main entry point for library tool.”而 Librarian 類 的注釋則寫明 “Core librarian tool”其Combine方法的文檔注釋明確寫著 “Create a library by combining several intermediates (objects).”用法與命令行參數(shù)官方文檔給出的完整調(diào)用形式為lit.exe [-?] [-nologo] [-out libraryFile] objectFile [objectFile ...] [responseFile]其中objectFile為 candle 產(chǎn)出的.wixobj文件實際上也接受已有的.wixlib見下文源碼分析responseFile表示響應文件可以在一行一行列出參數(shù)以便復用。lit 支持的全部命令行參數(shù)如下完整繼承自官方文檔的 參數(shù)表開關含義-b指定用于定位所有文件的基路徑base path默認值為當前工作目錄。可重復使用也支持namepath的命名形式見下文-bfBind files into the library file即把源文件綁定進庫文件內(nèi)部默認不綁定-ext extension指定擴展程序集WixExtension 實現(xiàn)可加載多張表定義并解析 lit 自身不認識的附加參數(shù)-loc loc.wxl提供.wxl本地化文件將本地化字符串讀入庫-nologo跳過 lit 版本/logo 信息的輸出-out指定輸出庫文件路徑默認情況下 lit 會寫入當前工作目錄-pedantic顯示 pedantic吹毛求疵級提示消息-ss抑制文檔的 schema 校驗鏈接大型項目時可換取明顯的性能提升-sv抑制中間文件.wixobj版本不匹配檢查-swN按消息 ID 抑制指定警告可多次使用例如-sw1011 -sw1012-swall抑制所有警告已棄用等價于無參數(shù)-sw-v生成詳細verbose輸出-wxN把指定 ID 的警告提升為錯誤例如-wx1011 -wx1012-wxall把所有警告當作錯誤已棄用等價于無參數(shù)-wx-?顯示 lit 幫助信息從 ParseCommandLine 方法 的實現(xiàn)可以看到文檔與行為之間的幾處對應細節(jié)-b支持命名基路徑解析-b時并不只收集目錄。Run 方法 會把不含的-b值加入sourcePaths而在處理-bf時第 214–229 行會把namepath形式的值拆開后寫入NamedBindPaths。也就是說命名形式用于在綁定文件時按名字定位而普通形式同時充當源搜索路徑與綁定搜索路徑。默認輸出文件名當只給了一個輸入文件且未顯式-out時lit 會把該輸入文件擴展名替換為.wixlib作為輸出第 111–119 行如果給了多個輸入文件卻未指定-out則會拋出MustSpecifyOutputWithMoreThanOneInput錯誤。-sw/-wx的“空參即全部”語義-sw后面不帶數(shù)字時等價于抑制全部警告第 356–384 行-wx同理這也正是文檔標注-swall、-wxall為“deprecated”的原因——它們只是向后兼容的舊拼法觸發(fā)時會通過DeprecatedCommandLineSwitch警告提示改用-sw/-wx。-ss與-sv的作用點這兩個開關最終傳入Intermediate.Load/Library.Load第 185–196 行分別跳過 XSD schema 校驗與中間文件格式版本比對。文檔中提到-ss能帶來“鏈接期間的性能提升”對應的就是跳過每次加載.wixobj/.wixlib時的 XML schema 驗證開銷。響應文件以開頭的參數(shù)會被CommandLineResponseFile.Parse展開后遞歸解析第 433–436 行。輸入文件的識別先試 .wixobj再試 .wixlib一個容易被忽略的細節(jié)是lit 的輸入既可以是.wixobj也可以是已有的.wixlib因此 lit 天然支持“庫中庫”的逐級合并。源碼中對該輸入做了兩次嘗試加載// try loading as an object file try { Intermediate intermediate Intermediate.Load(inputFileFullPath, librarian.TableDefinitions, this.suppressVersionCheck, this.suppressSchema); sections.AddRange(intermediate.Sections); continue; // next file } catch (WixNotIntermediateException) { // try another format } // try loading as a library file Library loadedLibrary Library.Load(inputFileFullPath, librarian.TableDefinitions, this.suppressVersionCheck, this.suppressSchema); sections.AddRange(loadedLibrary.Sections);見 lit.cs 第 182–197 行。即先按對象文件解析失敗后再按庫文件解析兩種格式的 Section 被統(tǒng)一收集最后交給librarian.Combine(sections)合成一個新庫。Combine 階段做了什么入口 Section 與符號校驗Librarian.Combine并不是簡單拼接它還會執(zhí)行結(jié)構(gòu)校驗。Librarian.cs 第 79–89 行 顯示Combine在把 Section 裝入新Library后調(diào)用Validate后者第 118–133 行會通過FindEntrySectionAndLoadSymbols檢查庫中是否存在多個入口 Sectionentry section并收集全部符號用于檢查重復對每個 Section 調(diào)用ResolveReferences在庫內(nèi)部先解析符號引用。換句話說如果兩個輸入對象各自聲明了會沖突的符號或都聲稱自己是入口 Sectionlit 會在這一階段報錯而不是留到 light 階段才暴露——這是 lit 相比“直接把所有 .wixobj 丟給 light”多出來的一層提前校驗。-bf 文件綁定把文件裝進 .wixlib-bfbind files的含義是“把文件綁定進庫文件”。其底層邏輯在 Library.Save 中當提供BinderFileManager即啟用了-bf時lit 會遍歷庫中每張表、每行中的ObjectField指向外部文件的路徑字段逐個調(diào)用binderFileManager.ResolveFile解析文件路徑并給該字段分配一個CabinetFileId——被綁定的文件最終會打進庫文件內(nèi)部cabinet 形式隨庫一起分發(fā)而不要求 light 階段還能在磁盤上找到這些文件。對應到 Run 方法的綁定分支若未指定-bfbinderFileManager被置為 nullLibrary.Save就不會執(zhí)行任何文件綁定若指定了-bf則使用擴展提供的BinderFileManager若加載的擴展自帶否則回退到內(nèi)置的new BinderFileManager()-b收集到的路徑會同時進入BinderFileManager.BindPaths綁定搜索路徑與sourcePaths源搜索路徑。因此-b與-bf是配套使用的-bf決定“是否綁定”-b決定“去哪里找要綁定的文件”文檔中-b的默認值說明當前工作目錄即指此搜索路徑。-loc 本地化字符串-loc loc.wxl允許把 WiX 本地化源文件.wxl的字符串讀入庫。從 lit.cs 第 242–247 行 可以看到每個-loc文件通過Localization.Load加載后調(diào)用library.AddLocalization(localization)即本地化字符串作為庫的一部分被保存供 light 在鏈接階段按語言選用。這與-ext一樣是可重復的開關解析代碼對-loc走的是localizationFiles.Add(...)的累加分支第 315–325 行。一個可復用的調(diào)用示例基于上述分析一個典型的 lit 手工調(diào)用形如路徑為示例參數(shù)含義見上文lit.exe -out ProductComponents.wixlib -bf -b ..\resources -loc strings.wxl -nologo Product.wixobj Components.wixobj含義把Product.wixobj與Components.wixobj合并為ProductComponents.wixlib-bf使對象中引用的文件被綁定進庫-b ..\resources告訴 lit 去哪里解析這些文件-loc把strings.wxl的字符串一并存入庫。之后的鏈接階段只需light.exe -ext WixUIExtension ProductComponents.wixlib -out Product.msiMSBuild 集成wixproj 中的 Lit 任務在.wixprojWiX 項目文件體系中l(wèi)it 不需要手工調(diào)用而是由 WixTasks 中的 Lit 任務 驅(qū)動。該任務繼承WixToolTaskToolName固定為lit.exe第 117–120 行。把任務屬性映射回命令行開關的 BuildCommandLine 方法 展示了完整的參數(shù)生成邏輯任務屬性生成的命令行說明ObjectFiles必填追加為位置參數(shù)要合并的.wixobj文件OutputFile必填、輸出-out輸出.wixlib路徑BindInputPaths/BaseInputPaths-b基/綁定路徑BindInputPaths的項若帶BindName元數(shù)據(jù)會生成namepath命名形式對應 CLI 的命名-b。BaseInputPaths已被標記[Obsolete]計劃 v4.0 移除BindFiles-bf是否綁定文件Extensions/ExtensionDirectory/ReferencePaths-ext擴展加載LocalizationFiles-loc本地化文件Pedantic-pedantic顯示 pedantic 消息SuppressSchemaValidation-ss跳過 schema 校驗SuppressIntermediateFileVersionMatching-sv跳過中間文件版本檢查AdditionalOptions原樣拼接逃生艙口用于傳入-sw、-wx等值得注意的是-nologo、-sw、-wx等在任務屬性中并未一一對應而是通過WixToolTask基類的通用選項以及AdditionalOptions透傳-nologo則由 MSBuild 日志行為Verbosity在基類中統(tǒng)一處理。測試用例佐證倉庫的自動化測試為 lit 的行為提供了可直接查閱的驗證依據(jù)單庫鏈接等價性Input.WixlibTests.cs 的 SingleWixlib 測試 先用 candle 編譯BasicProductWxs再用Lit對象測試框架中的Lit類自動繼承Candle的輸出與設置生成.wixlib最后分別用原始.wixobj和.wixlib各鏈接一次 MSI 并用Verifier.VerifyResults斷言兩者一致——證明了“經(jīng) lit 合并”不改變鏈接結(jié)果。多庫合并MultipleWixlibs測試第 44–97 行分別構(gòu)建Product.wixlib與Component.wixlib驗證 light 能同時鏈接多個.wixlib并產(chǎn)生與直接鏈接兩個.wixobj相同的結(jié)果后續(xù)還有“多庫共享目錄”的變體用例第 99–133 行。wixproj 構(gòu)建庫WixprojTests 的 SimpleLibrary 測試 構(gòu)建一個簡單 wixproj斷言輸出目錄中生成WixProject.wixlibLibraryWithParameters測試第 122–140 行則進一步斷言傳給Lit任務的命令行包含-bf、-nologo、-sw1、-wx等子串驗證項目屬性到命令行開關的透傳是否正確。小結(jié)lit 是 WiX Toolset 中專門用于“預鏈接/組合”的工具它把 candle 產(chǎn)出的.wixobj或既有.wixlib合并為.wixlib在合并期完成入口 Section 與符號引用校驗Librarian.CombineValidate并可選地通過-bf-b把文件綁定進庫、通過-loc把本地化字符串打包入庫最終交給 light 完成 MSI 鏈接。對于手工命令行構(gòu)建完整參數(shù)以本文參數(shù)表與 官方文檔 為準對于 wixproj 項目構(gòu)建則通過 Lit 任務 的屬性完成同等配置。需要注意的適用前提是lit 消費的是 WiX 3.x 的中間文件格式-ss/-sv僅用于繞過校驗/版本檢查以換取性能或兼容舊對象不建議在無必要時長期開啟。贊分享開發(fā)工具構(gòu)建工具【免費下載鏈接】wix3WiX Toolset v3.x項目地址https://gitcode.com/gh_mirrors/wi/wix3點擊查看免費下載相關推薦WiX Toolset 的 Lit MSBuild 任務Lit Task完整指南從 .wixproj 配置到 .wixlib 庫構(gòu)建WiX Toolset 的 Lit MSBuild 任務Lit Task完整指南從 .wixproj 配置到 .wixlib 庫構(gòu)建 導讀 Lit Tas開發(fā)工具構(gòu)建工具WiX Toolset 鏈接器 light.exe 完全指南從 .wixobj 到 MSI 數(shù)據(jù)庫的鏈接與綁定全流程WiX Toolset 鏈接器 light.exe 完全指南從 .wixobj 到 MSI 數(shù)據(jù)庫的鏈接與綁定全流程 本文以 WiX Toolset v3.x開發(fā)工具構(gòu)建工具WiX Toolset 3.x 中的 Light 任務.wixproj 鏈接參數(shù)完整指南WiX Toolset 3.x 中的 Light 任務.wixproj 鏈接參數(shù)完整指南 Light 是 WiX 工具集v3.x的 MSBuild 鏈接任開發(fā)工具構(gòu)建工具創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考