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

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

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

界面:

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

 static void Main(string[] args)
{
if (args.Length < )
return;
Console.WriteLine(args[]);
Console.WriteLine(args[]);
var wiXml = new GenerateWiXml(args[], "$(var.Dev)", args[]);
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 DirAndCompDocument
if (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 files
var 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 安装部署教程(十六) -- 自动生成多语言文件

    因为持续集成需要,所有项目编译完之后生成一个多语言的安装包.之前生成mst文件都是手动操作,而且mst文件必须每次重新和新的安装包“关联”,否则中文的安装包去调用英文的资源的时候就会报类似于“类型转换 ...

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

    在上一篇中曾留下两个问题,.Net捆绑安装不触发以及路径选择的问题现在都已经解决,这段时间花的最多的地方还是WPF调样式上面,奈何WPF功力不够,暂时还是没有达到自己想要的效果.另外ViewModel ...

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

    在上一篇中,留下了许可协议的问题,目前已经解决.感谢网友武全的指点! 问题 一般我们是用WixVariable 来设定许可协议.如下所示: <WixVariable Id="WixUI ...

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

    在WIX中,CustomAction用来在安装过程中执行自定义行为.比如注册.修改文件.触发其他可执行文件等.这一节主要是介绍一下CustomAction的7种用法. 在此之前要了解InstallEx ...

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

    前段时间整理5篇WIX(Windows Installer XML)的安装教程,但还不够完善,这里继续整理了七个知识点分享给大家.WIX最新版本3.8,点击下载 WIX安装部署(一)同MSBuild自 ...

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

    经常安装PC端的应用,特别是重装系统之后,大致分为两类.一类像QQ,搜狗输入法这样的.分三步走的:第一个页面可以自定义安装路径和软件许可.第二个页面显示安装进度条,第三个页面推荐其他应用.先不管人家怎 ...

  7. Wix 安装部署教程(十一) ---QuickWix

    这次发布的是这两天做的一个WIX工具QuickWIX,主要解决两个问题点1.对大文件快速生成wix标签(files,Directories,ComponentRef):2.比较前后两次工程的差异.大的 ...

  8. Wix 安装部署教程(三)自定义安装界面和行为

    接上一篇自定义安装界面,这篇继续探索,首先介绍下,Wix为我们定义了五种风格,每种风格的UI都是有一定顺序的.我们可以改变安装顺序,也可以完全自定义一个Dialog插入其中.比如Wix_Mondo 风 ...

  9. Wix 安装部署教程(八) 自动生成XML小工具

    这个功能类似于Heat.exe,指定文件夹,生成对应的WIX标签.Winform做的,代码简单,生成的标签需要粘贴到对应的目录才能使用,并不是一步到位. 需要设定两个参数,一个是文件夹路径,一个是文件 ...

随机推荐

  1. NDB Cluster 存储引擎物理备份

    NDB Cluster 存储引擎物理备份NDB Cluster 存储引擎也是一款事务性存储引擎,和Innodb 一样也有redo 日志.NDBCluter 存储引擎自己提供了备份功能,可以通过相关的命 ...

  2. 为什么LTE系统的最小时间单位是Ts?

    之前一直在做LTE物理层相关的工作,一直有个疑惑, 在36.211开头的一章定义Ts的大小是1/(15000*2048)s,为什么定义这么一个奇怪的unit time. 最近才反应过来,这跟FFT/I ...

  3. Fiddler 手机端证书安装No root certificate was found

    测试过程中发现在浏览器中访问代理服务器及端口,不通,提示要安装证书. 点击证书安装时,提示错误: No root certificate was found,Have you enabled HTTP ...

  4. java TreeMap用法

    转自:http://huchenqiang90.blog.163.com/blog/static/11250080020101025956498/ 最近工作遇到需要按一个model中不同的列进行排序的 ...

  5. 安卓奇葩问题之.so库加载不了

    真是哔了狗了. 今天突然遇到一个问题:之前用第三方的密码控件,给了一个.so库文件.然后我就放在了/jniLibs/armeabi目录下. 运行,一切都很OK. 然后重点来了.N天之后的今天,突然打包 ...

  6. 关于L'Hopital法则

    1.首先需要使用 罗尔定理 函数f(x)在闭区间[a,b]连续在开区间(a,b)可微,如果f(a)=f(b),那么至少存在一点c使函数导数f'(c)=0 注意需要再(a,b)可微,如果函数有角点,断点 ...

  7. 使用CSS设置行间距,字间距.

    字间距1.text-indent设置抬头距离css缩进即对,对应div设置css样式text-indent : 20px; 缩进了20px 2.letter-spacing来设置字与字间距_字符间距离 ...

  8. 站点图标favicon.ico

    favicon.ico图标: 网站的favicon.ico需要一次额外的http请求,无论你是否有在html里面添加 link链接 <link rel="shortcut icon&q ...

  9. 如何解决WebService参数传递中文乱码问题

    1,问题由来 我的主要工作是负责统一适配平台这块,主要任务是提供给客户统一的调用接口,客户使用这个接口可以通过我们再调不同厂家的接口.主要流程如下: 现在客户那边传来的请求报文里面包含中文,使用web ...

  10. PHP-递归扫描目录和删除目录

    (1) 通过递归扫描目录并打印 // php递归扫描目录 function scanMyDir($path){ // 打开目录 $dh = opendir($path); echo '<ul&g ...