MSBuild是什么?
MSBuild全称(Microsoft Build Engine),是用来生成.NET程序的平台。您可能不知道它,但是如果您在使用VS做开发,那么一定时时刻刻在使用它。因为是它在背后为你管理生成你 的项目文件。当新建一个项目时,注意下项目文件夹中的*.*proj文件就是为MSBuild提供的,这是个文本文件,基于XML格式,里面包含有项目所 包含的文件,生成配置,输出配置等信息。当把一个文件或者图片等添加到项目中,就会在这里添加一个描述,反之则删除一个描述信息;在项目属性页所做的配置 也会在这里存储。
为何去了解MSBuild
想去了解这个源于以前学WPF时的疑惑(当时就想从MSBuild下手了,一直没精力,拖到现在),因为不知道XAML为何就跑到生成的程序集,以 及这个XAML标记最后变成什么,WPF是如何处理这些XAML标签与C#代码的?一般写代码时我都会清楚的知道这个代码最后经由编译器变成了什么,这样 心里比较底。但是这个XAML,是看不透,看不透就心里堵得慌,不踏实,我比较喜欢刨根问底,所以就想到通过这个入口探个究竟。
我想从MSBuild中得到什么
第一解决我上面说疑惑; 第二理解项目中这些文件是如何组织在一起并生成最终程序的(就像在WPF上Build是生成出来exe,而WP7则是出来一个XAP包,为何?); 第三了解到为止,以看懂理解为目的,不做深入研究。
MSBuild基本概念
MSBuild有四个基本块(属性、项、任务、目标):
MSBuild属性: 属性是一些键/值对,主要用来存储一些配置信息。
MSBuild 项: 主要是存储一些项目文件信息,以及文件的元数据信息(如版本号)。
MSBuild任务: Build过程中的一些原子操作(如CSC、MakeDir)
MSBuild目标: 按特定的顺序将任务组织在一起,并允许在命令行单独指定各个部分。
一句话总结MSBuild的作用:利用配置信息对项目文件实施特定顺序的操作。
MSBuild属性
属性声明方式:
1 <?xml version="1.0" encoding="utf-8"?>
2 <!--根元素,表示一个项目-->
3 <!--DefaultTargets用于定默认执行的目标-->
4 <Project DefaultTargets="build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
5 <!--属性都要包含在PropertyGroup元素内部-->
6 <PropertyGroup>
7 <!--声明一个"linianhui"属性,其值为"hello world"-->
8 <linianhui>hello world</linianhui>
9 </PropertyGroup>
10 <!--目标-->
11 <Target Name="build">
12 <!--MSBuild提供的一个内置任务,用于生成记录信息用$(属性名)来引用属性的值-->
13 <Message Text="$(linianhui)"></Message>
14 </Target>
15 </Project>
保存此文件到d:\helloworld.xml文件。打开CMD窗口,输入MSBuild helloworld.xml:
打印出“linianhui”属性的值。MSBuild提供一些保留属性,可以方便的引用$,如$(MSBuildProjectFile)将返回项目文件的完整名(helloworld.xml)。其他的保留属性可以查阅MSDN帮助文档。
MSBuild项
项声明方式:
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<!--项都要包含在ItemGroup元素内部-->
<ItemGroup>
<!--声明一个"CSFile"的项,Include表示引入"csfile1.cs"文件-->
<CSFile Include="csfile1.cs">
<!--Version表示项的元数据(附加信息)-->
<Version>1.0.0.0</Version>
</CSFile>
<!--也可用";"一次引入多个文件-->
<CSFile Include="csfile2.cs;csfile3.cs"/>
</ItemGroup>
<Target Name="build">
<!--@引用项的值,默认以";"分割开-->
<!--输出"csfile1.cs;csfile2.cs;csfile3.cs"-->
<Message Text="@(CSFile)"></Message>
<!--可以加第二个参数替换默认的";"分隔符-->
<!--输出"csfile1.cs+csfile2.cs+csfile3.cs"-->
<Message Text="@(CSFile,'+')"></Message>
<!--%引用项的元数据,输出"1.0.0.0"-->
<Message Text="%(CSFile.Version)"></Message>
</Target>
</Project>
MSBuild任务
上述Msaage就是一个任务,用于打印信息,常用的一些还包括CSC、MakeDir、Copy等等,大多任务都是有输出信息的,这些信息可以通过OutPut元素存储在属性或者项中。先写如下CS代码:
1 //存为d:\MSBuildDemo.cs
2 public class MSBuildDemo
3 {
4 static void Main()
5 {
6 System.Console.WriteLine("MSBuild组织编译");
7 }
8 }
然后更改项目文件如下:
1 <?xml version="1.0" encoding="utf-8"?>
2 <Project DefaultTargets="build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
3 <ItemGroup>
4 <!--指定要编译的文件-->
5 <CSFile Include="MSBuildDemo.cs"/>
6 </ItemGroup>
7 <Target Name="build">
8 <!--使用Csc任务,对应csc编译器-->
9 <!--Sources属性表示要编译的文件集合-->
10 <!--TargetType表示编译目标类型,对应csc编译器的/target参数-->
11 <Csc Sources="@(CSFile)"
12 TargetType="exe">
13 <!--OutputAssembly为csc的输出参数-->
14 <!--PropertyName表示把TaskParameter属性所指定的输出参数的值存储到outputExeName这个属性中-->
15 <!--Output还有一个ItemName属性,表示存储到一个项中-->
16 <Output TaskParameter="OutputAssembly" PropertyName="outputExeFileName"/>
17 </Csc>
18 <!--Message任务就可以使用csc所导出的属性outputExeFileName了-->
19 <!--输出MSBuildDemo.exe-->
20 <Message Text="$(outputExeFileName)"/>
21 <!--Exec任务可以运行带有指定程序(可加参数)或命令-->
22 <!--运行刚从MSBuildDemo.cs源文件编译好的程序-->
23 <!--运行结果为"MSBuild组织编译"-->
24 <Exec Command="$(outputExeFileName)"></Exec>
25 </Target>
26 </Project>
用MSbuild执行此项目文件,如期正确打印信息。
MSBuild目标
上面的一个例子中Target元素就是MSBuild目标,此目标按照编译源代码、打印编译好的程序文件名、执行该文件这个顺序组织了这三个任务。这就是目标所要做的事情。先简单介绍到这里吧,关于(属性、项、任务、目标)的一些扩展信息会在下一篇介绍。