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();
        }
    }

调用它的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

时间: 2024-10-24 23:54:20

Wix 安装部署教程(十一) ---QuickWix的相关文章

WIX 安装部署教程(六) 为你收集的七个知识点

前段时间整理5篇WIX(Windows Installer XML)的安装教程,但还不够完善,这里继续整理了七个知识点分享给大家.WIX最新版本3.8,点击下载 WIX安装部署(一)同MSBuild自动生成打包文件 WIX安装部署(二)自定义安装界面和行为 WIX安装部署(三)自定义安装界面和行为 WIX安装部署(四)添加安装文件及快捷方式 WIX安装部署(五)Bootstrap 捆绑安装 1.设置路径变量 有的时候路径过长,文件又比较多,重复粘贴一个地址总是不舒服,而且要改起来也很麻烦,那这个

Wix 安装部署教程(九) --用WPF做安装界面

经常安装PC端的应用,特别是重装系统之后,大致分为两类.一类像QQ,搜狗输入法这样的.分三步走的:第一个页面可以自定义安装路径和软件许可.第二个页面显示安装进度条,第三个页面推荐其他应用.先不管人家怎么实现的,我们先回顾一下. QQ:       再一个就是分六步或七步走的,如QQ影音:欢迎界面,用户许可,安装组件,安装目录,安装进度,安装完成,有七步的,一般会多一些软件推荐.当然还有其他的,比如是基于ClickOnce打包的,就一个界面,一个进度条.没有安装目录选择,这一般不是商业软件.先说第

Wix 安装部署教程(十二) -- 自动更新WXS文件

上一篇分享了一个QuickWIX,用来对比两个工程前后的差异,但是这样还是很繁琐,而且昨天发现有Bug,目录对比有问题.这次改变做法,完全让程序自动去更新WXS文件,然后再用CCNet去自动编译,这样的话,工程师更新文件,再也不用我去编译,发布了. 思路:在原来的基础上,传入工程路径和目标文件夹,用模板的方式,更新变动的部分生成新的WXS文件覆盖原来的文件,一开始我思路搞错了,想在比较的基础上去更新变动的部分,比如一个文件删除了,就把这个File移除掉,同理对于组件和目录,但是这样比较费事,容易

Wix 安装部署教程(十六) -- 自动生成多语言文件

因为持续集成需要,所有项目编译完之后生成一个多语言的安装包.之前生成mst文件都是手动操作,而且mst文件必须每次重新和新的安装包“关联”,否则中文的安装包去调用英文的资源的时候就会报类似于“类型转换失败”的错误.基于这两点,有必要程序化这个流程,不然每次打包都得找我了.以下是程序的记录.比较简单. 其实就是用程序调用cmd,再次之前,请记得将wix的bin目录加入到系统变量中.否则命令不会被识别:然后将程序执行目录指向目标目录. static void Main(string[] args)

Wix 安装部署教程(四) 添加安装文件及快捷方式

通过之前三篇的介绍,大家对wix的xml部署方式也应该有一些认识,今天天气不错,再来一发.主要介绍桌面,开始菜单,卸载等功能的如何添加.希望园友们支持! 一.如何添加文件 Demo打包程序很简单,就一个exe,但实际过程中,往往还要引用一些dll,配置文件.我们如何安装到目标文件下呢.这个就比windows installer 麻烦些了,在windows installer中直接一个添加引用就可以了. 但wix也不麻烦,首先要明白各个元素的作用,Directory定义了安装目录,Componen

Wix 安装部署教程(十) --来,用WPF做个漂亮的安装界面

在上一篇中曾留下两个问题,.Net捆绑安装不触发以及路径选择的问题现在都已经解决,这段时间花的最多的地方还是WPF调样式上面,奈何WPF功力不够,暂时还是没有达到自己想要的效果.另外ViewModel做了些调整,状态更加分明.安装效果是仿照搜狗输入法做的.先上效果图.   以上这只是四个基本的页面,更细化一些可以分出卸载的进度页面,卸载的完成页面,对修复同理,还有安装失败,用户取消提示页面,再就是能检测新版本并覆盖安装,这些都可以根据状态去添加页面.下面简单的说下思路和新的问题点. 关键流程 安

Wix 安装部署教程(十三) -- 多语言安装包

这几天摸索WIX的多语言安装包(这里是Wix的setup 工程,不是Bundle),终于走通了,感谢网友uni的指点.WIX的多语言安装包能够根据系统环境自动切换界面语言,你也可以通过命令指定语言.下面我说一说步骤.共4步. 1.设置WixLocalization文件. Wxl文件就相当于应用程序的资源文件.让我们根据不同的语言来编写不同的文本内容. 例如我们新建一个WixUI_zh-cn.wxl ,来处理简体中文. <WixLocalization Culture="zh-cn"

Wix 安装部署教程(十五) --CustomAction的七种用法

在WIX中,CustomAction用来在安装过程中执行自定义行为.比如注册.修改文件.触发其他可执行文件等.这一节主要是介绍一下CustomAction的7种用法. 在此之前要了解InstallExecuteSequence,它是一个Action的执行序列. Installer会按照默认顺序来执行这些Action.通过字面意思也大概知道这些Action的目的.这些方法不是每次一都执行,分安装和卸载.如果CustomAction没有指定,很可能会安装卸载的时候都会执行一次. • AppSearc

Wix 安装部署教程 获取管理员权限

应用程序运行的时候,难免会读写文件,产生新的数据.但Program Files下的文件是不能随便更改,Win7下如果没有权限,将会被拒绝.我现在有两种方式,一种是将数据路径移到Program Data目录下,一个是给文件赋予权限. ProgramData <Directory Id="CommonAppDataFolder"> <Directory Id="YourFolder" Name="YourFolder"> &l