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>