Wix 安裝部署教程(十一) ---QuickWix


      這次發布的是這兩天做的一個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

 

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM