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

我们下一步的工作是发布我们的网站,也就是创建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. IHttpModule实现URL重写

    1.用自定义IHttpModule实现URL重写 一般来说,要显示一些动态数据总是采用带参数的方式,比如制作一个UserInfo.aspx的动态页面用于显示系统的UserInfo这个用户信息表的数据, ...

  2. RedHat7搭建Nginx+Apache+PHP

    Nginx做为前端服务器(本机IP:192.168.136.104),将访问PHP页面的动态请求转发给Apache服务器(只监听本地回环地址172.0.0.1:80) 安装Apache# yum -y ...

  3. SetUID、SetGID中的大小写Ss和Sticky bit中的大小写Tt

    大写:原文件/目录没有执行(x)权限 小写:原文件/目录有执行(x)权限 例如: 原文件:-rwxr-xr-x 增加SetUID后 4755 变为:-rwsr-xr-x 再如: 原文件:-rwxr-- ...

  4. volatile用处说明

      在JDK1.2之前,Java的内存模型实现总是从主存(即共享内存)读取变量,是不需要进行特别的注意的.而随着JVM的成熟和优化,现在在多线程环境下volatile关键字的使用变得非常重要. 在当前 ...

  5. (转)Spring读书笔记-----Spring核心机制:依赖注入

    Java应用(从applets的小范围到全套n层服务端企业应用)是一种典型的依赖型应用,它就是由一些互相适当地协作的对象构成的.因此,我们说这些对象间存在依赖关系.加入A组件调用了B组件的方法,我们就 ...

  6. c#中string.trimstart() 和string.trimend() 的用法

    trim(),trimstart(),trimend()这样写是去掉空格,trimstart(a)是去掉字符串开始包含char[] a的字符,trimend同trimstart. 例:char[] a ...

  7. C#当中的多线程_任务并行库(下)

    4.8 处理任务中的异常 下面这个例子讨论了任务当中抛出异常,以及任务异常的获取     class Program     {         static void Main(string[] a ...

  8. C#当中的多线程_线程基础

    前言 最近工作不是很忙,想把买了很久了的<C#多线程编程实战>看完,所以索性把每一章的重点记录一下,方便以后回忆. 第1章 线程基础 1.创建一个线程 using System; usin ...

  9. mac下安装配置nginx环境

    本文介绍 nginx 在mac上的安装. 我是通过brewhome 来安装的. brew install nginx 一路顺畅. 下面是安装信息. 复制代码 代码如下: hematoMacBook-P ...

  10. OC - 15.NSURLSession与NSURLSessionTask

    简介 NSURLSession也能完成网络请求 NSURLConnection在iOS9中不推荐使用,NSURLSession是iOS9中推荐使用的网络请求方式 NSURLSession需要与NSUR ...