標籤:
這次發布的是這兩天做的一個WIX工具QuickWIX,主要解決兩個問題點1.對大檔案快速產生wix標籤(files,Directories,ComponentRef);2.比較前後兩次工程的差異。大的WIX工程有好幾千個檔案,開發人員增加dll,或者資源檔都是不確定的,而且很多時候我們無法直接取代,所以需要一個對比的功能,來告訴打包人員哪裡新增了,哪裡刪除了,這樣加快打包速度。
一、介紹
工具是個簡單的winform程式。下面做幾點說明。
1.產生XML:會更具路徑和變數資訊,產生Fragment,Feature和Directory。
2.對比:找出差異的檔案、目錄和組件資訊:
3.自動儲存最新工程:如果選中,在對比的時候就會把當前工程的資訊儲存下來。
4.儲存:手動儲存當前工程資訊
5.目錄:當前工程的目錄資訊。
6.組件:當前工程的組件資訊。
7.目錄:當前工程的目錄資訊。
二、原理
1.工程目錄如下,所有WIX先關對象都繼承IWixBase介面。
用於產生對象本身的WIX標籤。這樣在有子類的時候,調用子類的ToWixString()方法即可。
public interface IWixBase { /// <summary> /// 返回wix標籤 /// </summary> /// <returns></returns> string ToWixString(); }
2.WixProj包含WixDirectory,WixFragment,WixFeature,是Wix對象最父類的元素。也是用來儲存xml的對象。
[Serializable] public class WixProj : IWixBase { private WixDirectory _wixDirectory; private WixFragment _wixFragment; private WixFeature _wixFeature; /// <summary> /// 比較Directory /// </summary> public WixDirectory WixDirectory { get { return _wixDirectory??(_wixDirectory=new WixDirectory()); } set { _wixDirectory = value; } } /// <summary> /// 比較Files /// </summary> public WixFragment WixFragment { get { return _wixFragment??(_wixFragment=new WixFragment()); } set { _wixFragment = value; } } /// <summary> /// 比較ComponentRef /// </summary> public WixFeature WixFeature { get { return _wixFeature??(_wixFeature=new WixFeature()); } set { _wixFeature = value; } } public string ToWixString() { var sb = new StringBuilder(); sb.Append(WixFragment.ToWixString()); sb.Append("\r\n"); sb.Append("\r\n"); sb.Append(WixDirectory.ToWixString()); sb.Append("\r\n"); sb.Append("\r\n"); sb.Append(WixFeature.ToWixString()); return sb.ToString(); } }View Code
調用它的ToWixString方法就可以獲得整個工程wix元素。
3.WixComparator,就是用來比較工程用的,包含兩個WixProj對象,一個用來載入xml,一個即當前工程。
它的BeginCompare方法就是用來開始比較差異的。也是分三個部分去比較。比如對於files 要比較出新增的、刪除的和修改的。目錄和組件不包含修改部分(他們就一個id)。
/// <summary> /// 開始比較 /// 返回files差異 /// 返回Components差異 /// 返回Directory差異 /// </summary> /// <returns>比較結果</returns> public string BeginCompare() { //先比較files //就需要比較目錄 //如果之前的不存在 就不必要比較 if (BeforeWixProj==null) { return "---舊工程不存在---\r\n"; } var sb = new StringBuilder(); sb.Append(CompareDirectoryRefs()); sb.Append(CompareDirectory()); sb.Append(CompareComponeRefs()); if (sb.Length == 0) { sb.Append("\r\n 這兩個工程檔案一致! "); } return sb.ToString(); }
而其他wix對象都有一個Compare方法。用來和同類型的對象比較。該對象在GenerateWiXml類中進行初始化。
4.Wixconfig中包含一些配置資訊,比如註冊檔案、過濾尾碼,初始組件等。
小結:接下來的想法是能夠在打包工程編譯之前就自動修改好wxs檔案,不然每次要開啟工程修改確實麻煩。下面是原始碼,有興趣的一起折騰交流。希望本文對你有協助。
http://pan.baidu.com/s/1ntmolhZ
Wix 安裝部署教程(十一) ---QuickWix