MSBuild

MSBuild

前序:鉴于上篇文章写得很随性,有许多Bug,尤其是在MSBuild上。所以,今天特整理一份MSBuild的文章。

概述(OverView)

MSBuild是一个免费的开源构建 工具集 ,用于管理本地C++代码.在Visual Studio2013之前,MSBuild是作为.NET框架的一部分,但是在其之后,MSBuild被绑定到了Visual Studio.所以, Visual Studio依赖于MSBuild,但是MSBuild并不依赖于Visual Studio.(本文主要简单阐述了MSBuild构建流程中的项目文件语法,关于具体MSBuild的构建步骤可查看参考文档或MSDN)


MSBuild 包含了软件开发的 一套自动化流程 ,包括 编译、打包、测试、发布和创建说明文档。 MSBuild 的执行基于MSBuild 项目文件,该文件和Apache Ant 使用的XML具有相似的语法规则;


在命令行中使用MSBuild(Using MSBuild at a Command Prompt)

MSBuild.exe MyProj.proj /property:Configuration=Debug

图一

项目文件(Project File)

MSBuild依赖的项目文件(Project File)是一个 基于XML的项目文件 ,该文件用来描述即将建立的项目;

Properties

属性,顾名思义,在构建中充当一种类似变量的角色:

定义:

<PropertyGroup> 
 <BuildDir>Build</BuildDir> 
</PropertyGroup> 

用法:可以通过 $(property name) 来在项目文件中使用属性.

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

Items

  • Items是整个构建系统中的输入部分,代表的就是代码文件;
  • Items根据item的名称,将其分成不同的Item 类型;
  • Item类型是可以用作Task参数的item集合;
  • Item的类型是Task中的执行过程中的Step;


在项目文件中使用Items (Creating Items in a Project File)

Item类型被包含在项目文件(.csproj)中的<ItemGroup></ItemGroup>下,ItemGroup的子元素的名称,即是项的类型(Item Type)。其中,Include指定了项类型包含的文件

<ItemGroup> 
 <Compile Include = "file1.cs"/> 
 <Compile Include = "file2.cs"/> 
</ItemGroup> 

其中,Compile指的是项类型,它可以包含多个文件;也支持下面这种写法:多个文件用分号隔开

<ItemGroup> 
 <Compile Include = "file1.cs;file2.cs"/> 
</ItemGroup> 

在项目文件中引用项类型(Referencing Items in a Project File)

在项目文件中使用项类型,语法: @(Item Type) ,可以为Task指定具体的项类型;


使用通配符指定项类型的文件(Using Wildcards to Specify Items)

可以使用**、*和?三种通配符指定一组文件作为构建的输入.

  • ?通配符指定一个单一的字符
  • *通配符指定零个或多个字符
  • **通配符匹配部分路径

包含当前项目中所有的cs文件

<CSFile Include="*.cs"/> 

D盘下的所欲cs文件

<CSFile Include="D:/**/*.cs"/> 

使用Exclude属性 (Using the Exclude Attribute)

Exclude属性是用来排除某些不想加入到项类型中的文件,比如,不想DoNotBuild.cs文件加入到CSFile项类型

<ItemGroup> 
 <CSFile  Include="*.cs" Exclude="DoNotBuild.cs"/> 
</ItemGroup> 

需要注意的是,Exclude只排除当前Item中Include已经包含的文件,不会影响到项类型中其他的item,例如:项类型Compile并不会排除Form1.cs

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


项元数据(Item Metadata)

项类型中除了有Include属性和ExClude属性之外,还可以有项元数据.项元数据向Task提供了更多的关于项类型的信息;项元数据是以键值对的方式来表示,如下:

<ItemGroup> 
 <CSFile Include="one.cs;two.cs"> 
 <Culture>Fr</Culture> 
 </CSFile> 
</ItemGroup> 

在项目文件中引用项元数据(Referebcing Item Metadata in a Project File)

如果想在项目文件(.csproj)中使用项元数据,语法:%(ItemType.ItemMetadataName)

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
 <ItemGroup> 
 <Stuff Include="One.cs" > 
 <Display>false</Display> 
 </Stuff> 
 <Stuff Include="Two.cs"> 
 <Display>true</Display> 
 </Stuff> 
 </ItemGroup> 
 <Target Name="Batching"> 
 <Message Text="@(Stuff)" Condition=" '%(Display)' == 'true' "/> 
 </Target>