首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

MSBuild 核心概念速成:從 XML 腳本到自動化構建管道

     編輯:關於.NET

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`)。

五大核心元素詳解

1. Property (屬性/變量)

<PropertyGroup>
  <Name Condition=" '$(Name)' == '' ">DefaultName</Name>
  <OutDir>$(MSBuildProjectDirectory)\bin\Release</OutDir>
</PropertyGroup>
  • 引用語法:`$(PropertyName)`
  • 命令行覆蓋:`msbuild /p:Name=CustomValue`
  • Condition 實現默認值邏輯。

2. Item (項目/集合)

<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>
  • 引用語法:`@(ItemName)` 展開為分號分隔列表。
  • 元數據:`%(ItemName.MetadataName)`,如 `%(Compile.FullPath)`。
  • 轉換:`@(ItemName -> '%(Filename).xml')` 生成對應列表。
  • 批處理:`` 對每個項目執行一次 Task。

3. Target (目標/構建單元)

<Target Name="Clean">
  <RemoveDir Directories="$(OutDir)" />
</Target>

<Target Name="Build" DependsOnTargets="Clean;Restore">
  <Csc Sources="@(Compile)" OutputAssembly="$(OutDir)\MyApp.exe" />
</Target>
  • 命令行指定:`msbuild /t:Clean,Build`
  • DependsOnTargets 聲明依賴順序。
  • BeforeTargets/AfterTargets 插入擴展點 (如 `AfterTargets="Build"`)。

4. Task (任務/執行單元)

  • 內置:`Message`、`Copy`、`Delete`、`Exec`、`Csc`、`Vbc`、`MSBuild` (構建子項目)。
  • 參數屬性對應 XML 屬性,支援 Property/Item 引用。
  • Condition 控制是否執行。

5. Project (根元素)

  • ToolsVersion:對應 MSBuild 版本 (VS 版本)。
  • DefaultTargets:未指定 `/t` 時運行的目標。
  • InitialTargets:無論如何先運行的初始化目標。

三大社區擴展包 (幾乎覆蓋所有非常用任務)

套件NuGet 包典型任務
MSBuild Community TasksMSBuildTasksGit/SVN 操作、Zip/Unzip、Regex、XslTransform、AssemblyInfo 版本號生成
MSBuild Extension PackMSBuildExtensionPackIIS 網站/應用池管理、SQL Server 腳本執行、Registry、WMI、Azure 資源
SDC Tasks LibrarySDC.TasksCode Coverage、Code Analysis、FxCop、NDoc、強簽名、GAC 安裝

為什麼不直接用批處理 / PowerShell?

  • 與 .NET 生態深度整合:直接調用編譯器 API、解析項目引用圖。
  • 增量構建:自動檢測輸入/輸出文件時間戳,跳過無變更目標 (核心優勢)。
  • 並行構建:`/m` 參數啟用多核並行 (如 `msbuild /m:4`)。
  • 白盒診斷:`/v:diag` 輸出完整構建圖、每個 Task 耗時、跳過原因。
  • 可擴展性:任意 .NET 語言編寫 Custom Task (繼承 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 完整實戰代碼。掌握它,構建腳本不再是黑盒,而是可編程、可擴展、可診斷的自動化管道核心。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved