MSBuild 是 .NET 構建引擎核心,`.csproj`/`.sln` 本質均為 MSBuild 腳本。掌握其四大核心元素——**Project、Property、Item、Target、Task**——即可編寫自定義構建邏輯、接管 CI/CD 管道、實現增量編譯與並行構建。本文以極簡示例切入,覆蓋核心語法與實戰擴展包。
<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="https://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Welcome>Hello MSBuild!</Welcome>
</PropertyGroup>
<Target Name="Build">
<Message Text="$(Welcome)" />
</Target>
</Project>
保存為 `build.proj`,命令行 `msbuild` 即可運行 (自動拾取當前目錄 `*.proj`)。
<PropertyGroup>
<Name Condition=" '$(Name)' == '' ">DefaultName</Name>
<OutDir>$(MSBuildProjectDirectory)\bin\Release</OutDir>
</PropertyGroup>
Condition 實現默認值邏輯。<ItemGroup>
<Compile Include="Src\**\*.cs" Exclude="Src\Obj\**\*.cs" />
<Content Include="Config\*.config">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Reference Include="Newtonsoft.Json">
<HintPath>..\packages\Newtonsoft.Json\lib\net45\Newtonsoft.Json.dll</HintPath>
</Reference>
</ItemGroup>
<Target Name="Clean">
<RemoveDir Directories="$(OutDir)" />
</Target>
<Target Name="Build" DependsOnTargets="Clean;Restore">
<Csc Sources="@(Compile)" OutputAssembly="$(OutDir)\MyApp.exe" />
</Target>
DependsOnTargets 聲明依賴順序。BeforeTargets/AfterTargets 插入擴展點 (如 `AfterTargets="Build"`)。Condition 控制是否執行。ToolsVersion:對應 MSBuild 版本 (VS 版本)。DefaultTargets:未指定 `/t` 時運行的目標。InitialTargets:無論如何先運行的初始化目標。| 套件 | NuGet 包 | 典型任務 |
|---|---|---|
| MSBuild Community Tasks | MSBuildTasks | Git/SVN 操作、Zip/Unzip、Regex、XslTransform、AssemblyInfo 版本號生成 |
| MSBuild Extension Pack | MSBuildExtensionPack | IIS 網站/應用池管理、SQL Server 腳本執行、Registry、WMI、Azure 資源 |
| SDC Tasks Library | SDC.Tasks | Code Coverage、Code Analysis、FxCop、NDoc、強簽名、GAC 安裝 |
Microsoft.Build.Utilities.Task)。<UsingTask TaskName="MSBuildTasks.AssemblyInfo" AssemblyFile="$(MSBuildCommunityTasksLib)" />
<Target Name="Version" BeforeTargets="Build">
<AssemblyInfo CodeLanguage="CS"
OutputFile="Properties\AssemblyInfo.cs"
AssemblyVersion="1.0.$(BUILD_NUMBER).0"
AssemblyFileVersion="1.0.$(BUILD_NUMBER).0" />
</Target>
打開任意 `.csproj` 即可看到 MSBuild 完整實戰代碼。掌握它,構建腳本不再是黑盒,而是可編程、可擴展、可診斷的自動化管道核心。