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

上一篇分享了一个QuickWIX,用来对比两个工程前后的差异,但是这样还是很繁琐,而且昨天发现有Bug,目录对比有问题。这次改变做法,完全让程序自动去更新WXS文件,然后再用CCNet去自动编译,这样的话,工程师更新文件,再也不用我去编译,发布了。

思路:在原来的基础上,传入工程路径和目标文件夹,用模板的方式,更新变动的部分生成新的WXS文件覆盖原来的文件,一开始我思路搞错了,想在比较的基础上去更新变动的部分,比如一个文件删除了,就把这个File移除掉,同理对于组件和目录,但是这样比较费事,容易出Bug。

工程目录,在原来的基础上没有增加对象。多了一个Templet文件,用于放模板文件。

界面:

如果改成控制台程序,就三句:

 static void Main(string[] args){if (args.Length < 2)return;Console.WriteLine(args[0]);Console.WriteLine(args[1]);var wiXml = new GenerateWiXml(args[0], "$(var.Dev)", args[1]);wiXml.Generate();wiXml.WixComparator.AfterWixProj.SaveAsLast();Console.WriteLine("替换完成");}

先创建GenrateWiXml对象,调用Generate方法来根据目录来生成WIX元素。每个元素都有ToWixString方法。  主要是SaveAsLast方法,更换了两个WXS文件。Product.wxs和DevComponents.wxs。前者找Feature 和 Directory 标签,后者分两种情况,根目录和其他目录,因为我根目录文件夹写了些其他的元素,不能全部替换Files,另外其他的DirectoryRef 就直接添加了。

 public void SaveAsLast(){#region DirAndCompDocumentif (DirAndCompDocument == null){DirAndCompDocument = XDocument.Load(GetWxsProductPath());}var rawpath1 = Path.Combine(AppDomain.CurrentDomain.BaseDirectory + @"..\..\Templet\", WixConfig.WxsProductPath);var productTemp = XDocument.Load(rawpath1);// 组件var comelement = WixFeature.NewXElement();var feature = productTemp.Descendants().First().Elements().First().Elements().FirstOrDefault(n => n.Name == WixConfig.Np + "Feature" && n.Attribute("Id").Value == "ProductFeature");if (feature != null){feature.Elements().Remove();feature.Add(comelement.Elements());}// 目录var direlement = WixDirectory.NewXElement();var element = productTemp.Descendants().First().Elements().First().Elements().FirstOrDefault(n => n.Name == WixConfig.Np + "Directory");if (element != null){var dir = element.Elements().First();dir.Elements().Remove();dir.Add(direlement.Elements());}productTemp.Save(GetWxsProductPath());#endregion #region filesvar rawpath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory + @"..\..\Templet\", WixConfig.WxsFilePath);var dirTemp = XDocument.Load(rawpath);var fragment = dirTemp.Descendants().First().Elements().First();var installfolder = WixFragment.DirectoryRefs;//根目录下面的dir 都要递归处理 要全部加到DirTemp中去foreach (var wd in installfolder){//最特别的一个if (wd.Id == "INSTALLFOLDER"){//找到Install下面的comp 全部加进来var firstcop = fragment.Elements().First().Elements().First();foreach (var file in wd.Component.Files){firstcop.Add(file.XElement);}}else{//全部添加
                    fragment.Add(wd.XElement);}}dirTemp.Save(GetWxsFilePath());#endregion}

这个WXS模板,需要自己调整了。而每个元素的XElement基本上是这样生成的(WIXDirectoryRef):

              if (_xElement == null){XNamespace np = "http://schemas.microsoft.com/wix/2006/wi";var str = ToWixString();_xElement = XElement.Parse(str);_xElement.Name = np + "DirectoryRef";// 确保后代的命名空间都对var cops = _xElement.Elements();foreach (var xe in cops){xe.Name = np + "Component";foreach (var x in xe.Elements()){x.Name = np + "File";}}}

调用XElement的Parse方法后,需要修改元素的命名空间,不然每个元素都会出现一个xmlns=“”的标签。

小结:将上面的工程改成控制台配合自己的WIX的SetUp工程,然后部署到CCNET就可以自动打包了。以下是源码,比较部分替换元素的代码没有删除,先留着。希望对你有帮助。

http://pan.baidu.com/s/1hUtki

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

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

    Wix 安装部署教程(十六) -- 自动生成多语言文件 原文:Wix 安装部署教程(十六) -- 自动生成多语言文件 因为持续集成需要,所有项目编译完之后生成一个多语言的安装包.之前生成mst文件都是 ...

  2. Wix 安装部署教程(十四) -- 多语言安装包之用户许可协议

    Wix 安装部署教程(十四) -- 多语言安装包之用户许可协议 原文:Wix 安装部署教程(十四) -- 多语言安装包之用户许可协议 在上一篇中,留下了许可协议的问题,目前已经解决.感谢网友武全的指点 ...

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

    原文:Wix 安装部署教程(十三) -- 多语言安装包 这几天摸索WIX的多语言安装包(这里是Wix的setup 工程,不是Bundle),终于走通了,感谢网友uni的指点.WIX的多语言安装包能够根 ...

  4. 【OpenStack(Train版)安装部署(十二)】之win7系统安装,qcow2格式镜像制作

    文章目录 本文章由公号[开发小鸽]发布!欢迎关注!!! 1.win7系统qcow2格式镜像制作 (1)概述 (2)-失败-安装ISO镜像到qcow2磁盘. (3)vnc viewer连接虚机 (4)C ...

  5. 群晖NAS教程(二十一)、利用Docker安装DDNS动态域名解析,自动更新域名解析到公网IP(支持阿里云、腾讯云dnspod、Cloudflare、华为云)

    群晖NAS教程(二十一).利用Docker安装DDNS动态域名解析,自动更新域名解析到公网IP(支持阿里云.腾讯云dnspod.Cloudflare.华为云) 为了更好的浏览体验,欢迎光顾勤奋的凯尔森 ...

  6. Wix 安装部署(二)自定义安装界面和行为

    Wix 安装部署(二)自定义安装界面和行为 原文:Wix 安装部署(二)自定义安装界面和行为 上一篇介绍了如何联合MSBuild来自动生成打包文件和对WIX的一些初步认识,http://www.cnb ...

  7. 五丶阿东安装部署教程+青龙对接阿东及傻妞实现自动登录

    阿东安装部署教程+青龙对接阿东及傻妞实现自动登录 没有服务器的先自行购买,这里推荐腾讯云2H4G8M首年70–点击购买 青龙面板安装 傻妞安装教程--+命令 QQ交流:1014549449 ----- ...

  8. 在线答题考试小程序源码系统 支持在线刷题+考试二合一+安装部署教程

    分享一个在线答题考试小程序源码系统,支持在线刷题+考试二合一,程序包含前后端和详细的安装部署教程,可以用来给学生刷题,给员工刷题,给政企员工刷题,万能通用版适合任何行业在线刷题及考试. 系统功能一览: ...

  9. Wix 安装部署(五) Bootstrapper 捆绑安装

    Wix 安装部署(五) Bootstrapper 捆绑安装 原文:Wix 安装部署(五) Bootstrapper 捆绑安装 Wix的xml配置确实很费劲,忍不住有点像吐槽一下,前四篇完成的功能在Wi ...

最新文章

  1. php 无法输出图像,ThinkPHP里无法输出图片 设置响应头
  2. 【学习笔记】Eureka服务治理代码实例、相关配置和原理机制详解
  3. java抽象类实现接口可以不用实现方法
  4. 杨波 微服务技术专家_专家称,这些是最有效的微服务测试策略
  5. 上位机软件控制下位机PHP,采用stm32f103CB硬件I2C1/2(自制硬件)中断/DMA访问,四轴开源程序,DMP,PCB外框图纸库文件,USBToVCOM代码下位机...
  6. 1001:Hello,World! 【信息学奥赛一本通(C++版)在线评测系统】
  7. Ubuntu 12/14 个性化配置
  8. 说说json和jsonp 也许你会明白它的原理 含有jQuery实例 蛋疼 ,我面试的时候被卡了 赶紧写一个回顾...
  9. 少儿编程线下培训水到渠成了吗?2018
  10. Memory Management Registers(GDTR, LDTR, IDTR, and TR)
  11. CentOS卸载自带的JDK
  12. ArcGIS水文分析实战教程(6)河流提取与河网分级
  13. [py]py常用模块小结
  14. mvc图片上传到服务器
  15. 万能Ghost全攻略(最详细完整的教程)
  16. 国网的“好管家”——业务可视化管理平台
  17. discuzx3.2自定义积分操作日志,discuzx积分二次开发完全记录
  18. 网管管理软件的作用及发展趋势
  19. python:实现使用分而治之找到单峰列表的峰值算法(附完整源码)
  20. css的定位属性——固定定位和粘性定位

热门文章

  1. boost::hana::front用法的测试程序
  2. boost::dynamic_bitset模块的测试程序
  3. GDCM:处理DICOM文件的示例
  4. boost::contract模块实现equal的测试程序
  5. boost::contract模块实现virtual private protected的测试程序
  6. ITK:在矢量图像上执行注册
  7. VTK:可视化算法之DisplacementPlot
  8. OpenCV霍夫直线houghlines点集的实例(附完整代码)
  9. C语言打印链表的中间节点的算法(附完整源码)
  10. c++Hash Search哈希搜索的实现算法(附完整源码)