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

简介: 原文:Wix 安装部署教程(十二) -- 自动更新WXS文件        上一篇分享了一个QuickWIX,用来对比两个工程前后的差异,但是这样还是很繁琐,而且昨天发现有Bug,目录对比有问题。这次改变做法,完全让程序自动去更新WXS文件,然后再用CCNet去自动编译,这样的话,工程师更新文件,再也不用我去编译,发布了。
原文: 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 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

目录
相关文章
|
7月前
|
JavaScript 前端开发 应用服务中间件
SAP UI5 本地开发时 ui5.yaml 文件对构建 Release 版本应用目录的影响分析试读版
SAP UI5 本地开发时 ui5.yaml 文件对构建 Release 版本应用目录的影响分析试读版
41 1
|
PHP
【laravel项目】@9 laravel-admin汉化菜单 新增模块
【laravel项目】@9 laravel-admin汉化菜单 新增模块
118 0
【laravel项目】@9 laravel-admin汉化菜单 新增模块
|
jenkins 持续交付 数据安全/隐私保护
Jenkins2.249-自定义插件安装(十一)
自定义安装Jenkins2.249 由于之前一直使用的Jenkins2.176版本在做sonarqube集成的时候总是有问题,因此直接使用最新版本的2.249来集成
260 0
Jenkins2.249-自定义插件安装(十一)
|
XML C# 数据格式
Wix 安装部署教程(九) --用WPF做安装界面
原文:Wix 安装部署教程(九) --用WPF做安装界面       经常安装PC端的应用,特别是重装系统之后,大致分为两类。一类像QQ,搜狗输入法这样的。分三步走的:第一个页面可以自定义安装路径和软件许可。
1567 0
|
NoSQL Redis Docker
RedisManager使用手册(五)-- 自定义Redis安装包
RedisManager物理机安装包的构建和Docker镜像的构建
1677 0
|
C# C++ Windows
Wix 安装部署教程(十五) --CustomAction的七种用法
原文:Wix 安装部署教程(十五) --CustomAction的七种用法       在WIX中,CustomAction用来在安装过程中执行自定义行为。比如注册、修改文件、触发其他可执行文件等。这一节主要是介绍一下CustomAction的7种用法。
1904 0
|
自然语言处理 测试技术
Wix 安装部署教程(十六) -- 自动生成多语言文件
原文:Wix 安装部署教程(十六) -- 自动生成多语言文件      因为持续集成需要,所有项目编译完之后生成一个多语言的安装包。之前生成mst文件都是手动操作,而且mst文件必须每次重新和新的安装包“关联”,否则中文的安装包去调用英文的资源的时候就会报类似于“类型转换失败”的错误。
1233 0
|
XML 移动开发 数据格式
Wix 安装部署教程(十一) ---QuickWix
原文:Wix 安装部署教程(十一) ---QuickWix       这次发布的是这两天做的一个WIX工具QuickWIX,主要解决两个问题点1.对大文件快速生成wix标签(files,Directories,ComponentRef);2.比较前后两次工程的差异。
1423 0
|
C#
Wix 安装部署教程(十) --来,用WPF做个漂亮的安装界面
原文:Wix 安装部署教程(十) --来,用WPF做个漂亮的安装界面        在上一篇中曾留下两个问题,.Net捆绑安装不触发以及路径选择的问题现在都已经解决,这段时间花的最多的地方还是WPF调样式上面,奈何WPF功力不够,暂时还是没有达到自己想要的效果。
1524 0
|
Android开发
用Links方式安装Eclipse插件真方便
使用Eclipse一年多了,一直都是把所有插件直接安装在plugins和features目录下,虽然目录变得比较乱但也不怎么影响使用。最近因为工作需要,经常更换Eclipse和一些插件的版本,我发现每新装一个Eclipse就要花不少时间来装那几个常用插件,印象里有一种方法可以让插件以链接的方式存在,就在网上查了一下,请看这篇文章,讲得很明白。
1341 0