原文

MSBuild是微软VS的Build平台。

你可以在Visual Studio或Windows命令行中运行MSBuild。在这我们使用VS创建一个MSBuild项目。你可以在VS中编辑项目文件,使用命令行来Build这个项目检查结果。

创建MSBuild项目

VS项目系统基于MSBuild。因此通过VS可以非常简单的创建一个项目文件。本节,你将创建一个C#的项目文件。

创建项目文件

  1. 打开VS
  2. 点击File菜单,指向New,然后点击Project
  3. 在弹出的New Project对话框中选择C#项目类型,然后点击Windows Forms Application项目模板。在Name box中输入BuildApp。然后选择解决方案的路径,例如D:\,默认选中Create directory for solution, 在Solution Name中输入BuildApp
  4. 点击OK创建项目于文件

检查项目文件

  1. Solution Explorer中,点击BuilApp项目节点
  2. Properties浏览器中, 可以看到Project File属性值为BuildApp.csproj。所有的项目于文件名的后缀都是proj。如果你创建的是VB项目,那么项目文件名为BuildApp.vbproj
  3. 右键项目节点,点击Unload Project
  4. 再次右键项目节点,点击Edit BuildApp.csproj。项目文件出现在代码编辑器中。

Targets & Tasks

项目文件是xml格式的,根节点为Project

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

必须要置顶Project元素的xmlns命名空间。

build项目的工作是依靠TargetTask完成的。

  • task是最小的工作单元,是原子性的。task是独立的可执行组件,它可以有自己的输入和输出。Tasks更多详细信息见Tasks
  • target是要执行的task的名字集合。项目文件的最下面有两个target:BeforeBuild和AfterBuild。
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>

Targets更多详细信息见Targets

Project元素有个可选的DefaultTargets属性,用于选择默认的target去build,在这个例子中是Build。

<Project ToolsVersion="12.0" DefaultTargets="Build" ...

Buildtarget没有定义在项目文件中。它是通过Import元素从Microsoft.CSharp.targets文件中导入的。

<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />

添加一个Target和Task

  1. 在项目文件中的Import节点后添加:
<Target Name="HelloWorld">
</Target>

上面的代码创建了一个名为HelloWorld的target。

2. 在HelloWorld target中添加:

<Target Name="HelloWorld">
<Message Text="Hello"></Message> <Message Text="World"></Message>
</Target>
  1. 保存项目文件

Message task是MSBuild自带的众多task之一。更多请见Task Reference

Message task有一个名为Text的属性用于输入要输出的文本。HelloWorldtarget执行了两次task:首先显示"Hello",然后显示"World"。

Build Target

Visual Stuido Command Prompt中运行MSBuild build上面定义的HelloWorld target。使用/target或/t来选择target。

build target

  1. 点击开始菜单, 点击所有程序,找到Visual Studio Tools文件夹,点击其中的Visual Studio Command Prompt
  2. 在命令窗口中CD到项目文件所在的文件夹,本例中是 D:\BuildApp\BuildApp
  3. 运行msbuild 使用参数/t:HelloWorld指定buildHelloWorld target:
msbuild buildapp.csproj /t:HelloWorld
  1. 检查输出,你应该可以看到两行"Hello"和"World"
Hello
World

Build Properties

Build Properties是用来指导build的键值对。在项目文件的最上面已经定义了一个build properties:

<PropertyGroup>
...
<ProductVersion>10.0.11107</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{30E3C9D5-FD86-4691-A331-80EA5BA7E571}</ProjectGuid>
<OutputType>WinExe</OutputType>
...
</PropertyGroup>

所有的property都是PropertyGroup元素的子元素。属性名是子元素名, 属性值是子元素的text元素。 例如:

<TargetFrameworkVersion>v12.0</TargetFrameworkVersion>

上面定义了一个名为TargetFrameworkVersion的属性,其值为v12.0。

build properties可以随时重定义:

<TargetFrameworkVersion>v3.5</TargetFrameworkVersion>

检查property的值

使用下面的方法获取属性值:

$(PropertyName)

检查属性值

  1. 在代码编辑器中,用下面的代码替换掉HelloWorld target:
<Target Name="HelloWorld">
<Message Text="Configuration is $(Configuration)" />
<Message Text="MSBuildToolsPath is $(MSBuildToolsPath)" />
</Target>
  1. 保存项目文件
  2. 打开命令行窗口,运行下面的命令行:
msbuild buildapp.csproj /t:HelloWorld
  1. 你将看到下面的输出
Configuration is Debug
MSBuildToolsPath is C:\Program Files\MSBuild\12.0\bin

Conditional Properties(条件属性)

许多属性(如Configuration)是根据条件而定义的,例如:

<Configuration   Condition=" '$(Configuration)' == '' ">Debug</Configuration>

意思是如果Configuration property没有定义的话就定义一个值为Debug名为Configuration的属性。

几乎所有的MSBuild元素都有Condition attribute。更多请见Conditions

Reserved Properties

TODO

Enviroment Variables

TODO

在命令行中设置Properties

可以在命令行通过使用/property或/p来设置properties。

  1. 在命令行窗口中,输入并运行下面的命令:
msbuild buildapp.csproj /t:HelloWorld /p:Configuration=Release
  1. 检查输出。你应该可以看到:
Configuration is Release.

特殊字符

TODO

Build Items

一个item就是一个信息片段,典型的是一个文件名,被用来当作一个build系统的输入。例如,一组源文件的名字传入到Compile task中用于编译成为一个程序集。

所有的item都是ItemGroup元素的子元素。 item的名字就是子元素的名字, 值为Include attribute。如果多个item的名字是一样的那么其值为一个集合用;分隔。 例如:

<ItemGroup>
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>

上面的itemgroup有两个item。其值为:"Program.cs"和"Properties\AssemblyInfo.cs"。

下面的代码可以使用一个子元素达到上面的效果,关键在于Include中的;

<ItemGroup>
<Compile Include="Program.cs;Properties\AssemblyInfo.cs" />
</ItemGroup>

更多相关信息,请见Items:

检查Item Type值

通过下面的代码获取item type的值:

@(ItemType)
  1. 在代码编辑器中庸下面的代码替代HelloWorld target
<Target Name="HelloWorld">
<Message Text="Compile item type contains @(Compile)" />
</Target>
  1. 保存项目文件
  2. 在命令行窗口中运行下面的命令:
msbuild buildapp.csproj /t:HelloWorld
  1. 检查输出,应该能看到下面的内容:
Compile item type contains Form1.cs;Form1.Designer.cs;Program.cs;Properties\AssemblyInfo.cs;Properties\Resources.Designer.cs;Properties\Settings.Designer.cs

item type的值默认是用;分隔的。

可以通过下面的语法指定分隔符:

@(ItemType, Separator)

分行显示item type的值

  1. 在代码编辑器中,用下面的代码替换Message task:
<Message Text="Compile item type contains @(Compile, '%0A%0D')" />
  1. 保存项目文件
  2. 在命令行窗口中运行下面的命令:
msbuild buildapp.csproj /t:HelloWorld
  1. 输出如下
Compile item type contains Form1.cs
Form1.Designer.cs
Program.cs
Properties\AssemblyInfo.cs
Properties\Resources.Designer.cs
Properties\Settings.Designer.cs

Include, Exclude和通配符

可以在include attribute中使用通配符"*", "**", 和 "?" , 例如:

<Photos Include="images\*.jpeg" />

添加images文件夹下所有的.jpeg文件

<Photos Include="images\**.jpeg" />

添加images文件夹下及其子文件夹下所有的.jpeg文件

更多信息请见How to: Select the Files to Build

<Photos Include="images\*.jpeg" />
<Photos Include="images\*.gif" />

上面的代码创建了一个名为Photos的item type,包含了images文件夹下面的所有jped和gif文件。上面的代码等同于下面的代码:

<Photos Include="images\*.jpeg;images\*.gif" />

你可以使用Exclude attribute来排除文件:

<Compile Include="*.cs" Exclude="*Designer*">

添加所有的cs文件,除了名字含有"Designer"的文件。更多请见How to: Exclude Files from the Build

Exclude attribute只作用于当前item。例如:

<Compile Include="*.cs" />
<Compile Include="*.res" Exclude="Form1.cs">

上面的代码中Exclude不起任何作用。

include & exclude items

  1. 在代码编辑器中,用下面的代码替换Message task:
<Message Text="Compile item type contains @(XFiles)" />
  1. 在Import元素后面添加item group:
<ItemGroup>
<XFiles Include="*.cs;properties/*.resx" Exclude="*Designer*" />
</ItemGroup>
  1. 保存项目文件
  2. 在命令行窗口运行下面的命令:
msbuild buildapp.csproj /t:HelloWorld
  1. 检查输出,你将看到:
Compile item type contains Form1.cs;Program.cs;Properties/Resources.resx

[译]Walkthrough: Using MSBuild的更多相关文章

  1. 【译】ASP.NET Identity Core 从零开始

    原文出自Rui Figueiredo的博客,原文链接<ASP.NET Identity Core From Scratch> 译者注:这篇博文发布时正值Asp.Net Core 1.1 时 ...

  2. [译]:Xamarin.Android开发入门——Hello,Android深入理解

    返回索引目录 原文链接:Hello, Android_DeepDive. 译文链接:Xamarin.Android开发入门--Hello,Android深入理解 本部分介绍利用Xamarin开发And ...

  3. CSharpGL(56)[译]Vulkan入门

    CSharpGL(56)[译]Vulkan入门 本文是对(http://ogldev.atspace.co.uk/www/tutorial50/tutorial50.html)的翻译,作为学习Vulk ...

  4. RxJS + Redux + React = Amazing!(译一)

    今天,我将Youtube上的<RxJS + Redux + React = Amazing!>翻译(+机译)了下来,以供国内的同学学习,英文听力好的同学可以直接看原版视频: https:/ ...

  5. Entity Framework 6 Recipes 2nd Edition 译 -> 目录 -持续更新

    因为看了<Entity Framework 6 Recipes 2nd Edition>这本书前面8章的翻译,感谢china_fucan. 从第九章开始,我是边看边译的,没有通读,加之英语 ...

  6. RxJS + Redux + React = Amazing!(译二)

    今天,我将Youtube上的<RxJS + Redux + React = Amazing!>的后半部分翻译(+机译)了下来,以供国内的同学学习,英文听力好的同学可以直接看原版视频: ht ...

  7. 「译」JUnit 5 系列:条件测试

    原文地址:http://blog.codefx.org/libraries/junit-5-conditions/ 原文日期:08, May, 2016 译文首发:Linesh 的博客:「译」JUni ...

  8. Jenkins配置MSBuild实现自动部署(MSBuild+SVN/Subversion+FTP+BAT)

    所要用到的主要插件: [MSBuild Plugin] 具体操作: 1.配置MSBuild的版本 [系统管理]->[Global Tool Configuration]->[MSBuild ...

  9. CSharpGL(31)[译]OpenGL渲染管道那些事

    CSharpGL(31)[译]OpenGL渲染管道那些事 +BIT祝威+悄悄在此留下版了个权的信息说: 开始 自认为对OpenGL的掌握到了一个小瓶颈,现在回头细细地捋一遍OpenGL渲染管道应当是一 ...

随机推荐

  1. nginx php-fpm conf文件编写

    coco.conf ##upstream upstream php_coco_backend{ server 127.0.0.1:8019; } server { listen 80; server_ ...

  2. Nginx log日志切割shell

    #!/bin/bash#此脚本用于自动分割Nginx的日志,包括access.log和error.log#每天00:00执行此脚本 将前一天的access.log重命名为access-xxxx-xx- ...

  3. [WC2014]紫荆花之恋(动态点分治+替罪羊思想)

    题目描述 强强和萌萌是一对好朋友.有一天他们在外面闲逛,突然看到前方有一棵紫荆树.这已经是紫荆花飞舞的季节了,无数的花瓣以肉眼可见的速度从紫荆树上长了出来.仔细看看的话,这个大树实际上是一个带权树.每 ...

  4. poj 3080 Blue Jeans (暴力枚举子串+kmp)

    Description The Genographic Project is a research partnership between IBM and The National Geographi ...

  5. python安装tesseract

    一.最近在学习python爬虫的时候需要用到tesseract,但书上的给的教程对我并不适用,坑了好久天,才终于成功. 二.方法: 1.由于我看的是静谧博主的那本书.他给的教程在python3安装有问 ...

  6. 编写高质量代码:改善Java程序的151个建议 --[98~105]

    建议的采用顺序是List中泛型顺序依次为T.?.Object (1).List是确定的某一个类型 List表示的是List集合中的元素都为T类型,具体类型在运行期决定:List<?>表示的 ...

  7. 微信小程序框架——wepy使后感

    更新:2018年1月10日15:32:22 在ios8及部分机型下会有样式混乱的问题,经查找,原因是缺少浏览器前缀,需要加prefix. 解决方案见链接:wepy-less-autoprefix 另外 ...

  8. BZOJ2940 条纹

    条纹游戏是一个双人的游戏.所需要的物品有一个棋盘以及三种颜色的长方形条纹,这三种颜色分别是红色.绿色和蓝色.所有的红色条纹的尺寸是c*1,所有的绿色条纹的尺寸是z*1,所有的蓝色条纹的尺寸是n*1,这 ...

  9. 【css技能提升】完美的 Sticky Footer 布局

    在总结之前所做的项目时,遇到过下面这种情况. 在主体内容不足够多或者未完全加载出来之前,就会导致出现左边的这种情况,原因是因为没有足够的垂直空间使得页脚推到浏览器窗口最底部.但是,我们期望的效果是页脚 ...

  10. 【洛谷P1601 A+B Problem(高精)】

    题目背景 无 题目描述 高精度加法,x相当于a+b problem,[b][color=red]不用考虑负数[/color][/b] 输入输出格式 输入格式: 分两行输入a,b<=10^500 ...