MSBuild是.NET平台下的构建工具。

概览

MSBuild也就是用于构建应用的Microsoft Build Engine,它提供一个XML Schema用于project文件来控制构建平台process、build软件。
可以使用Visual Studio或者调用MSBuild.exe来完成这个操作。VS里边的project文件(.csprojvbprojvcxproj等)包含MSBuild XML代码,这些代码将在使用IDE build project的时候被运行。

在VS 2017里面使用的MSBuild版本是15,现在MSBuild装在VS的每个版本的文件夹中,比如C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild。也可以使用这个powershell命令来定位MSBuild:vssetup.powershell

MSBuildToolsPath不再是一个固定的位置。默认情况下将是相对于VS安装位置的MSBuild\15.0\Bin文件夹中。

MSBuild的相关概念

Properties

Properties是键值对,可以用来配置builds。

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

在整个project文件中,properties通过$(<PropertyName>)的方式被引用,比如使用上面的BuildDir属性,则用$(BuildDir)即可。
Properties的值可以被redefine。

MSBuild中保留的或众所周知的properties:

  • MSBuildBinPath: 当前使用的MSBuild binaries位置的绝对路径,例如C:\Windows\Microsoft.Net\Framework\<versionNumber>
  • MSBuildExtensionsPath
  • MSBuildProjectFile: project文件的完整文件名,例如MyApp.proj

完整的见MSBuild reserved and well-known properties

可以使用Condition attribute来为一个property提供默认值,如果这个property没有value则给它设置一个。比如

<ToolsPath Condition="''$(TOOLSPATH)' == ''">c:\tools</ToolsPath>

除了在project文件中做配置,也可以在命令行执行的时候设置property。如:

msbuild file.proj -property:Flavor=Debug
msbuild file.proj -p:Flavor=Debug
msbuild file.proj -p:Flavor=Debug;Platform=x86
msbuild file.proj -p:Flavor=Debug -p:Platform=x86

环境变量也会被认为是properties,并且自动被MSBuild装载进来。

Items

Items是build system的输入,通常代表文件。

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

file2.cs是append在file1.cs之后的,也可以结合***用wildcard模式,例如:

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

Targets

解释如何将tasks以特定的顺序组合到一起,并在命令行调用构建过程的各个部分。
感觉类似Ant的targets。详细的见MSBuild targets

Tasks

显示如何创建可以被MSBuild使用的可执行代码单元去执行原子的build操作。

Special Characters

% $ @ ' ; ? *

参考

微软官方文档:MSBuild