MSBuild Unveiled
Post on 22-Feb-2016
47 Views
Preview:
DESCRIPTION
Transcript
MSBuild Unveiled
Peter SchneiderMVP Visual Developer – Visual C#MCT, MCSD.NET, MCAD.NET, MCDBAps@ugwa.net
In This Session… MSBuild Architecture MSBuild – File Format MSBuild – Tips & Tricks
Auth
ors
PROJECT FILE - $%#^$&% - @$#%$^#
Abracadabra
Feed
s
Visual Studio .NET 2002/2003
VS Build System
Produces
Final Product
Pre build step0011010101111001011011011001110010100111Post build step
Final Product
Produces
FeedsAuthors
DEVELOPER
Authors
MSBuild Design Goals
MSBuild
PROJECT FILE<Project> <Property … /> <Item … /> <Target … /></Project>
MSBuild in 5 minutes The underlying build engine in Visual
Studio 2005 Fully open and published XML file
format for describing build Visual Studio 2005 build is fully
customizable You extend the build by writing
managed code (tasks and loggers) You don’t need the IDE to build Visual
Studio projects
MSBuild File Format<Project xmlns=“http://schemas.microsoft.com/developer/msbuild/2003”> <PropertyGroup> <AppName>MyCoolApp</AppName> <DebugSymbols>true</DebugSymbols> <OutputAssembly>$(AppName).exe</OutputAssembly> </PropertyGroup> <ItemGroup> <Compile Include=“Hello.cs” /> <Compile Include=“Program.cs” /> </ItemGroup> <Target Name=“Build”> <Message Text=“Executing Build Target for App $(AppName)” /> <Csc Sources=“@(Compile)” EmitDebugInformation=“$(DebugSymbols)”
OutputAssembly=“$(OutputAssembly)”/> </Target> <Import Project=“Microsoft.CSharp.targets” />
</Project>
MSBuild Key Components
Items
Properties
Targets
Tasks
Build Items Represent Input to the build system Grouped into Item Collections
Use userdefined CollectionNames Are used as Parameters for Tasks
Use Include and Exclude Attributes, Wildcards (**,*,?)
<ItemGroup> <Compile Include=“Hello.cs” /> <Compile Include=“Program.cs” /> </ItemGroup>
Build Items Reference ItemGroups with
@(ItemCollectionName)
Example:
<Csc Sources=„@(Compile)“/>
<ItemGroup> <Compile Include=“Hello.cs” /> <Compile Include=“Program.cs” /> </ItemGroup>
Build Item Metadata Items may contain MetaData
<ItemGroup> <Compile Include=“Hello.cs”> <Group>1</Group> </Compile> <Compile Include=“Program.cs”> <Group>2</Group> </Compile></ItemGroup>
Used for batching<Target Name=“Testbatch”> <Message Text=“@(Compile)” Condition=“ ’%(Group)’ == ‘1’ ”/></Target>
Well Known Item Meta Data%(FullPath)%(RootDir)%(Filename)%(Extension)%(RelativeDir)%(Directory)
%(RecursiveDir)%(Identity)%(ModifiedTime)%(CreationTime)%(AccessedTime)
<ItemGroup> <Compile Include=“*.cs” /></ItemGroup>
<Target Name=“BackupSources”> <Copy SourceFiles=“@(Compile)”
DestinationFiles=“%(Compile.Filename).bak” /></Target>
Build Properties Properties are key/value pairs used to
configure builds Defined in PropertyGroups
<PropertyGroup> <Configuration>Debug</Configuration></PropertyGroup>
Reference Properties with$(Propertyname)
e.g. $(Configuration)
Reserved Properties
MSBuildProjectDirectory MSBuildProjectFile MSBuildProjectExtension MSBuildProjectFullPath MSBuildProjectName MSBuildBinPath MSBuildProjectDefaultTargets MSBuildExtensionsPath
Some PropertyNames are reserved:
Environment Variables are accessible as Properties
Setting Properties You can set Properties from the
commandlineMSBuild.exe MyProject.proj /p:Configuration=Debug
MSBuild.exe MyProject.proj /p:Configuration=Debug;Another=Test
You can set Properties depending on other properties
<DebugType Condition="'$(Flavor)'=='DEBUG'">full</DebugType>
Build Targets Targets group tasks together in a
particular order Allows sections of the build process to
be called individually (Commandline, CallTarget Task)<Target Name=“Compile”> <Csc Sources=“@(SourceFiles)”/></Target>
MSBuild.exe MyProject.proj /t:CompileMSBuild.exe MyProject.proj /t:Clean;Compile
Default Targets Use DefaultTargets Attribute
<Project DefaultTargets=“Compile”>...</Project>
InitialTargets are executed first<Project InitialTargets=“Clean”>...</Project>
Incremental Builds Reduce build time Only builds targets which are out-of-
date or not yet built Specify Inputs and Outputs of the
target
<Target Name=“Compile” Inputs = “@(SourceFiles)” Outputs = “HelloWorld.exe” >
<Csc Sources=“@(SourceFiles)” OutputAssembly=“HelloWorld.exe”/>
</Target>
Build Tasks A Task is a unit of executable code
which performs atomic build operations<Target Name=“MakePublishDirectory”>
<Message Text=“Creating Publish Directory”/> <MakeDir Directories=“$(PublishDir)”/>
</Target>
Build Task Outputs Task can return Output mapped to
Items or Properties
<Target Name="CopyFiles"> <Copy SourceFiles="@(MySourceFiles)" DestinationFolder="@(MyDestFolder)">
<Output TaskParameter="CopiedFiles" ItemName="SuccessfullyCopiedFiles"/>
</Copy> <Message Text=“@(SuccessfullyCopiedFiles,”,”)”></Target>
Build Task ContinueOnError Specify the ContinueOnError Attribute
to succeed target for non-critical tasks Other possibilities:
<Target Name=“SampleTarget"> <TaskOne ContinueOnError="false"> </TaskOne> <TaskTwo> </TaskTwo> <OnError ExecuteTargets="OtherTarget" /> </Target>
Project Elements Use Choose, When, Otherwise
Elements<Project xmlns=“http://schemas.microsoft.com/developer/msbuild/2003”>
<PropertyGroup> <SampleProperty>Test</SampleProperty></PropertyGroup>
<Choose> <When Condition=“’$(SampleProperty)’ ==‘Test’”> <PropertyGroup> </PropertyGroup> </When> <Otherwise> </Otherwise></Choose>
</Project>
Summary Properties Items Targets Tasks Projects
top related