{"id":254,"date":"2026-10-13T03:31:19","date_gmt":"2026-10-13T03:31:19","guid":{"rendered":"http:\/\/www.scmgalaxy.com\/tutorials\/2010\/05\/05\/introduction-to-msbuild\/"},"modified":"2026-10-13T03:31:19","modified_gmt":"2026-10-13T03:31:19","slug":"introduction-to-msbuild","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/introduction-to-msbuild\/","title":{"rendered":"MSBuild Quick Start for DevOps: Projects, Targets, Tasks, and CLI Builds"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><em>Originally published on 2010-05-05; fully revised and updated.<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">MSBuild is Microsoft\u2019s build engine for defining, compiling, and packaging .NET projects from declarative project files. This guide helps developers and DevOps engineers understand MSBuild\u2019s core concepts, execution flow, and command-line usage for repeatable local and CI builds.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"600\" height=\"400\" src=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2010\/05\/msbuild-introduction.png\" alt=\"msbuild-introduction\" class=\"wp-image-4384\" srcset=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2010\/05\/msbuild-introduction.png 600w, https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2010\/05\/msbuild-introduction-300x200.png 300w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">What MSBuild is and where it fits<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The original post describes MSBuild as a Microsoft-supported build engine with XML-based configuration, editor IntelliSense support in Visual Studio, and a command-line entry point via <code>MSBuild.exe<\/code>.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Microsoft-supported build engine<\/li><li>XML-based project\/build definitions<\/li><li>IntelliSense support in Visual Studio via MSBuild schemas<\/li><li>Originally shipped with .NET Framework 2.0<\/li><li>Used by Visual Studio and Team Foundation Server build processes<\/li><li>CLI executable: <code>MSBuild.exe<\/code><\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Core MSBuild concepts<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Concept<\/th><th>Purpose<\/th><th>Example<\/th><\/tr><\/thead><tbody><tr><td>Project<\/td><td>Root XML document that defines the build process<\/td><td><code>.csproj<\/code>, <code>.vbproj<\/code>, custom <code>.proj<\/code><\/td><\/tr><tr><td>Property<\/td><td>Name\/value variable used throughout evaluation and execution<\/td><td><code>Configuration=Release<\/code><\/td><\/tr><tr><td>Item<\/td><td>Collection of inputs (often files), optionally with metadata<\/td><td><code>Compile Include=\"src\\**\\*.cs\"<\/code><\/td><\/tr><tr><td>Target<\/td><td>Named sequence of tasks, optionally with dependencies<\/td><td><code>Build<\/code>, <code>Clean<\/code>, <code>Publish<\/code><\/td><\/tr><tr><td>Task<\/td><td>Individual operation performed during a target<\/td><td><code>MakeDir<\/code>, <code>Copy<\/code>, <code>Exec<\/code>, <code>Csc<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Minimal MSBuild project example<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">This example shows all five concepts together: project, properties, items, targets, and tasks.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">Project<\/span> <span class=\"hljs-attr\">DefaultTargets<\/span>=<span class=\"hljs-string\">\"Build\"<\/span> <span class=\"hljs-attr\">xmlns<\/span>=<span class=\"hljs-string\">\"http:\/\/schemas.microsoft.com\/developer\/msbuild\/2003\"<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">PropertyGroup<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">Configuration<\/span> <span class=\"hljs-attr\">Condition<\/span>=<span class=\"hljs-string\">\" '$(Configuration)' == '' \"<\/span>&gt;<\/span>Release<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">Configuration<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">BuildDir<\/span>&gt;<\/span>artifacts\\$(Configuration)<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">BuildDir<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">PropertyGroup<\/span>&gt;<\/span>\n\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">ItemGroup<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">Compile<\/span> <span class=\"hljs-attr\">Include<\/span>=<span class=\"hljs-string\">\"src\\**\\*.cs\"<\/span> \/&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">ItemGroup<\/span>&gt;<\/span>\n\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">Target<\/span> <span class=\"hljs-attr\">Name<\/span>=<span class=\"hljs-string\">\"Prepare\"<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">MakeDir<\/span> <span class=\"hljs-attr\">Directories<\/span>=<span class=\"hljs-string\">\"$(BuildDir)\"<\/span> \/&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">Target<\/span>&gt;<\/span>\n\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">Target<\/span> <span class=\"hljs-attr\">Name<\/span>=<span class=\"hljs-string\">\"Build\"<\/span> <span class=\"hljs-attr\">DependsOnTargets<\/span>=<span class=\"hljs-string\">\"Prepare\"<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">Message<\/span> <span class=\"hljs-attr\">Text<\/span>=<span class=\"hljs-string\">\"Building into $(BuildDir)\"<\/span> <span class=\"hljs-attr\">Importance<\/span>=<span class=\"hljs-string\">\"high\"<\/span> \/&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">Target<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">Project<\/span>&gt;<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">How an MSBuild run executes<\/h2>\n\n\n\n<pre class=\"mermaid\">\nflowchart TD\n    A[Run MSBuild command] --> B[Load project file]\n    B --> C[Evaluate properties and items]\n    C --> D[Resolve target graph]\n    D --> E[Execute tasks in target order]\n    E --> F{Build succeeded}\n    F -- yes --> G[Produce build outputs]\n    F -- no --> H[Inspect logs and fix inputs]\n<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Ways to invoke MSBuild<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Invocation path<\/th><th>Best for<\/th><th>Strengths<\/th><th>Notes<\/th><\/tr><\/thead><tbody><tr><td>Visual Studio build actions<\/td><td>Interactive local development<\/td><td>IDE integration, IntelliSense, debugger-adjacent workflow<\/td><td>Good for day-to-day coding; less explicit for automation<\/td><\/tr><tr><td><code>MSBuild.exe<\/code> CLI<\/td><td>Scripted local builds and CI jobs<\/td><td>Deterministic command syntax, easy to parameterize<\/td><td>Preferred for repeatable automation and troubleshooting<\/td><\/tr><tr><td>Team Foundation Server build integration (historical context)<\/td><td>Centralized team builds<\/td><td>Build orchestration using MSBuild under the hood<\/td><td>MSBuild is leveraged by TFS; it is not the same product<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Command-line examples<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs language-bash\">MSBuild.exe MySolution.sln \/t:Build \/p:Configuration=Release\nMSBuild.exe MyProject.csproj \/t:Clean;Build \/p:Configuration=Debug\nMSBuild.exe MyProject.csproj \/t:Prepare \/v:minimal\nMSBuild.exe MyProject.csproj \/fl \/flp:logfile=msbuild.log;verbosity=diagnostic<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Reference links from the original post<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The following links were included in the 2010 article and are preserved for attribution and historical context:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/ms171452%28VS.90%29.aspx\">http:\/\/msdn.microsoft.com\/en-us\/library\/ms171452%28VS.90%29.aspx<\/a><\/li><li><a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/0k6kkbsd.aspx\">http:\/\/msdn.microsoft.com\/en-us\/library\/0k6kkbsd.aspx<\/a><\/li><li><a href=\"http:\/\/www.codeproject.com\/KB\/aspnet\/Automate_Builds.aspx\">http:\/\/www.codeproject.com\/KB\/aspnet\/Automate_Builds.aspx<\/a><\/li><li><a href=\"http:\/\/en.wikipedia.org\/wiki\/MSBuild\">http:\/\/en.wikipedia.org\/wiki\/MSBuild<\/a><\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Best practices for maintainable MSBuild files<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>Keep properties centralized and consistently named (for example: <code>Configuration<\/code>, <code>OutputPath<\/code>).<\/li><li>Break complex pipelines into small, well-named targets with clear dependencies.<\/li><li>Use item metadata intentionally so tasks can operate on structured inputs.<\/li><li>Always capture logs in CI runs to speed up build-failure triage.<\/li><li>Treat build scripts as code: version them, review them, and document expected inputs.<\/li><\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Learn how MSBuild works from the inside out, including projects, properties, items, targets, and tasks. This revised guide adds a build workflow diagram, command examples, and practical usage patterns for automation.<\/p>\n","protected":false},"author":1,"featured_media":4384,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[51],"tags":[4161,4158,366,4162,1249,4159,1073,4160],"class_list":["post-254","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-msbuild","tag-about-msbuild","tag-introduction-of-msbuild","tag-msbuild","tag-msbuild-concepts","tag-msbuild-guide","tag-msbuild-overview","tag-properties","tag-what-is-msbuild"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/254","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/comments?post=254"}],"version-history":[{"count":3,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/254\/revisions"}],"predecessor-version":[{"id":79082,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/254\/revisions\/79082"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media\/4384"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=254"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=254"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=254"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}