如果你没有看过第一部分教程,请先看完后再回到这里来继续我们的第二部分。

我们下一步的工作是发布我们的网站,也就是创建Publish target. 为了能使我们的target工作,我们需要给它传递两个属性,WebProjectOutputDir 和 OutDir, 这两个变量将确保我们能把我们的网站文件发布到正确的目录下面。

MSbuild 允许我们声明一个PropertyGroup, 在这个PropertyGroup中,我们可以创建一些中间变量用来存储一些设置数据,当我们进行读写操作的时候,我们会需要这些设置数据。

好了,看例子:

 <?xml version="1.0" encoding="utf-8" ?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Run">
<PropertyGroup>
<OutputFolder>Output</OutputFolder>
</PropertyGroup> <Target Name="Run">
<CallTarget Targets="Clean" />
<CallTarget Targets="Publish" />
</Target> <Target Name="Clean">
<ItemGroup>
<BinFiles Include="bin\*.*" />
</ItemGroup>
<Delete Files="@(BinFiles)" />
</Target> <Target Name="Publish">
<RemoveDir Directories="$(OutputFolder)" ContinueOnError="true" />
<MSBuild Projects="BuildDemoSite.csproj"
Targets="ResolveReferences;_CopyWebApplication"
Properties="WebProjectOutputDir=$(OutputFolder);OutDir=$(WebProjectOutputDir)\" />
</Target>
</Project>

正如你看到的,ResolveReferences target也被调用了,这是为了确保第三方的依赖也能够复制到Output目录下。

执行命令:msbuild build.xml, 结果如下

但是你也许注意到,在Output目录下,一些我不想复制的文件也一并复制了进来,比如Build.xml脚本本身,还有一些环境相关的配置文件:Live.Config & Test.Config. 那是因为它们的build action设置成了content, 你只要把build action设置成None,然后在重新执行下脚本,就不会出现上面的问题了。

现在这个网站基本上能够部署了,但是我们还需要把环境相关的配置复制到 web.config中来,那我们现在就开始这个教程

正如我们在 第一部分教程中提到的,除了web.config 文件,我们还有live.config 和 test.config文件。 同时web.config包含关于网站的所有配置,live.config和 test.config包含一些与部署环境相关的一些配置,接下来的工作就是要把部署环境相关的值正确的复制到web.config中来。

为了实现这个目的,我们通常的思路是用XPath从一个文件中读取配置信息,然后再通过XPath把这个信息写到另一个文件中去。但是快速浏览下内置的Task,没有找到有这个功能的,庆幸的是,MSBuild Community Tasks Project拯救了我们,它提供了XmlRead 和 XmllUpdate task。那先让我们下载,安装它。

在用他们之前,我们要确保下面的XML已经插入到我们的build.xml的根节点上了

<Import Project="C:\Program Files (x86)\MSBuild\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets"/>

然后我们增加一个Environment的中间变量在PropertyGroup中,当前它是被硬编码的写成了Test,我们会在以后的教程成修改这个,让它可以配置。

<PropertyGroup>
<Environment>Test</Environment>
<CompilationDebug />
<OutputFolder>Output</OutputFolder>
</PropertyGroup>

好,我们第一步是用XmlRead task去获取环境配置的数据,当前我只列举了XmlRead的一个例子, 你可以添加更多

 <Target Name="GetConfig">
<XmlRead XPath="configuration/system.web/compilation/@debug"
XmlFileName="$(Environment).config">
<Output TaskParameter="Value" PropertyName="CompilationDebug" />
</XmlRead>
</Target>
  1. GetConfig target包含所有的Xmlread task
  2. XmlFileName属性有个变量 $(Environment).config,这个变量指向的是我们的前面硬编码的Test.
  3. Output是用来把XmlRead的返回值存储到CompilationDebug属性中。

几乎同样的,我们的XmlUpdate采用同样的语法, 其中注意的是 DependsOnTargets=”GetConfig”是确保复制数据的时候,要先读再写。

 <Target Name="SetConfig" DependsOnTargets="GetConfig">
<XmlUpdate XPath="configuration/system.web/compilation/@debug"
XmlFileName="Output\web.config"
Value="$(CompilationDebug)" />
</Target>

好了,让我们开始见证奇迹的时候,执行下面的命令

msbuild Build.xml /t:SetConfig

检查一下是不是所有的命令都工作,打开output文件下的web.config文件,看看数据是不是跟Test.config中的一致。

你可以查看整个build.xml的代码

MSBuild 教程(2)的更多相关文章

  1. MSbuild 教程

    在.Net framework中,一个不太被大家熟知的工具就是MSBuild.这个命令行工具通过执行XML脚本可以自动生成软件工程文件. 但问题来了,“我为什么想要我的生成过程自动化?”. 其实,大部 ...

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

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

  3. WPF入门教程系列三——Application介绍(续)

    接上文WPF入门教程系列二——Application介绍,我们继续来学习Application 三.WPF应用程序的关闭 WPF应用程序的关闭只有在应用程序的 Shutdown 方法被调用时,应用程序 ...

  4. 转 Windows+VS2013爆详细Caffe编译安装教程

    1. 安装cuda Cuda是英伟达推出的GPU加速运算平台 我这里安装的是cuda7.5,已经安装过的忽略,还没有安装过的这里有安装教程.windows下面安装还是非常简单的. 点击打开链接    ...

  5. 每日构建【Daily Build Using CruiseControl.NET and MSBuild】(转载)

    在上一篇项目 管理实践教程二.源代码控制[Source Control Using VisualSVN Server and TortoiseSVN]中 我们已经讲解了如何使用TortoiseSVN和 ...

  6. 项目管理实践【三】每日构建【Daily Build Using CruiseControl.NET and MSBuild】

    在上一篇项目管理实践教程二.源代码控制[Source Control Using VisualSVN Server and TortoiseSVN]中我们已经讲解了如何使用TortoiseSVN和Vi ...

  7. 项目管理实践教程一、工欲善其事,必先利其器【Basic Tools】

    今天,我们首先安装一些必须的软件,主要有下面的4个,其中软件1和2使用在服务器机上,软件3和4安装在客户端机上.另外,我们还有用到MSBuild.RoboCopy.WebDeployment等等,在下 ...

  8. .NET Core快速入门教程 2、我的第一个.NET Core App(Windows篇)

    一.前言 本篇开发环境?1.操作系统: Windows 10 X642.SDK: .NET Core 2.0 Preview 二.安装 .NET Core SDK 1.下载 .NET Core下载地址 ...

  9. .NET Core快速入门教程 3、我的第一个.NET Core App (CentOS篇)

    一.前言 本篇开发环境?1.操作系统:CentOS7(因为ken比较偏爱CentOS7)2.SDK版本:.NET Core 2.0 Preview 你可能需要的前置知识1.了解如何通过Hyper-V安 ...

随机推荐

  1. Linux 确定系统glibc版本

    在shell中,可以直接运行glibc共享库文件获取glibc版本,CentOS下执行: /lib/libc.so. 输出为: GNU C Library stable release version ...

  2. 【bzoj1212】 [HNOI2004]L语言

    题目描述 标点符号的出现晚于文字的出现,所以以前的语言都是没有标点的.现在你要处理的就是一段没有标点的文章. 一段文章T是由若干小写字母构成.一个单词W也是由若干小写字母构成.一个字典D是若干个单词的 ...

  3. Sublime Text使用心得(一)

    以前写web前端样式都是用eclipse.myeclispe这些IDE开发工具,现在想纯粹的写点HTML的东西,一心想找一个轻量的编辑器,这样能够随手打开编写,方便平时业余学习.网上搜罗了一堆编辑器, ...

  4. JDK1.8聚合操作

    在java8 JDK包含许多聚合操作(如平均值,总和,最小,最大,和计数),返回一个计算流stream的聚合结果.这些聚合操作被称为聚合操作.JDK除返回单个值的聚合操作外,还有很多聚合操作返回一个c ...

  5. (转)META http-equiv="refresh" 实现网页自动跳转

    ***.html自动跳转文件代码如下: <HTML> <HEAD><META http-equiv="Refresh" content="5 ...

  6. 学习java随笔第十一篇:java窗体程序

    要开java的窗体程序,就要下载开发窗体的工具. 这里我用的是的myeclipse,可以直接在网上下载安装即可. 我用的是10.0版本的,如果需要汉化的话,可以看一下这篇文章:myeclipse.10 ...

  7. Js 的常用方法:页面跳转,Session,类继承

    MyApp.Base = function () { } var basePrototype = MyApp.Base["prototype"]; //对象克隆方法 basePro ...

  8. 额定能量不得超过160Wh, 等同是多少mAh电池容量?

    额定能量不得超过160Wh, 等同是多少mAh电池容量?行动电源容量标示, 正确应该是用Whr(Wh)瓦特小时来标示, 不过坊间标榜行动电源的容量通常是用xx000mAhWHr瓦特小时, 即是行动电源 ...

  9. 网络编程(学习整理)---3--(Udp)FeiQ实现广播消息群发

    1.广播群发消息: 这里使用的任然是UDP协议,使用方法还是比较简单的! 我就记录一下需要注意的一些地方(笔记): (1)这里是在局域网内,借用FeiQ聊天软件,编写一段程序,实现对局域网内的每一个登 ...

  10. DOM&SAX解析XML

    在上一篇随笔中分析了xml以及它的两种验证方式.我们有了xml,但是里面的内容要怎么才能得到呢?如果得不到的话,那么还是没用的,解析xml的方式主要有DOM跟SAX,其中DOM是W3C官方的解析方式, ...