MSBuild入门

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目标,此目标按照编译源代码、打印编译好的程序文件名、执行该文件这个顺序组织了这三个任务。这就是目标所要做的事情。先简单介绍到这里吧,关于(属性、项、任务、目标)的一些扩展信息会在下一篇介绍。如有错误之处,欢迎指正!

注:以上资料全部来自MSDN帮助文档。

 
 
分类: MSBuild
标签: MSBuild

摘要: MSBuild基本概念(续)在上一篇简单的介绍了下MSBuild中的四个基本块,每块介绍比较单薄,在这里对在大多数的项目模版生成的*.*proj文件中比较常见一些用法和概念做些补充。主要有一下几方面:MSBuild特殊字符:MSBuild保留的一些字符,以及XML中的特殊字符处理。MSBuild条件: Condition特性,作用类似于C#的if。MSBuild属性: 使用环境变量、保留属性、全局属性。MSBuild项: 元数据、项转换。MSBuild任务: ITask接口、UsingTask[自定义任务]、ContinueOnError。MSBuild目标: 初始目标、默认目标、目标依赖项。阅读全文
posted @ 2012-09-01 10:48 乱舞春秋 阅读(1554) | 评论 (2) 编辑
 
摘要: MSBuild是什么?MSBuild全称(Microsoft Build Engine),是用来生成.NET程序的平台。您可能不知道它,但是如果您在使用VS做开发,那么一定时时刻刻在使用它。因为是它在背后为你管理生成你的项目文件。当新建一个项目时,注意下项目文件夹中的*.*proj文件就是为MSBuild提供的,这是个文本文件,基于XML格式,里面包含有项目所包含的文件,生成配置,输出配置等信息。当把一个文件或者图片等添加到项目中,就会在这里添加一个描述,反之则删除一个描述信息;在项目属性页所做的配置也会在这里存储。为何去了解MSBuild想去了解这个源于以前学WPF时的疑惑(当时就想从MSB阅读全文
posted @ 2012-08-30 07:43 乱舞春秋 阅读(1853) | 评论 (4) 编辑

MSBuild是什么?的更多相关文章

  1. Jenkins配置MSBuild实现自动部署(MSBuild+SVN/Subversion+FTP+BAT)

    所要用到的主要插件: [MSBuild Plugin] 具体操作: 1.配置MSBuild的版本 [系统管理]->[Global Tool Configuration]->[MSBuild ...

  2. 使用roslyn代替MSBuild完成解决方案编译

    原本我是使用批处理调用 MSBuild 完成解决方案编译的,新版的 MSBuild 在 Visual Studio 2015 会自带安装. 当然在Visual Studio 2015 中,MSBuil ...

  3. MSBuild 编译 C# Solution

    Microsoft(R) 生成引擎版本 4.6.1055.0 [Microsoft .NET Framework 版本 4.0.30319.42000] 版权所有 (C) Microsoft Corp ...

  4. UWP Jenkins + NuGet + MSBuild 手把手教你做自动UWP Build 和 App store包

    背景 项目上需要做UWP的自动安装包,在以前的公司接触的是TFS来做自动build. 公司要求用Jenkins来做,别笑话我,之前还真不晓得这个东西. 会的同学请看一下指出错误,不会的同学请先自行脑补 ...

  5. MSBuild的简单介绍与使用

    MSBuild 是 Microsoft 和 Visual Studio的生成系统.它不仅仅是一个构造工具,应该称之为拥有相当强大扩展能力的自动化平台.MSBuild平台的主要涉及到三部分:执行引擎.构 ...

  6. Jenkins学习九:Jenkins插件之构建MSBuild

    Jenkins是Java语言编写的,一直好奇是否可以构建NET语言的项目,目前只了解到有一个插件MSBuild支持构建NET项目. 一.Jenkins安装插件MSBuild 二.VS构建CsharpH ...

  7. CCNET+MSBuild+SVN实现每日构建

    最近开始将源代码迁移到SVN,于是便考虑到如何从SVN定期获取源码,自动编译并部署以减轻工作量并提高工作效率.通过多方搜集资料并进行研究,基本实现了这个功能.对于每日构建的概念就不具体展开了,可以在各 ...

  8. Msbuild项目集成右键菜单编译

    DS1.背景:   我们为什么要将VS2008命令行编译.sln文件集成到右键菜单呢? 原因一:VS2008很好很强大,但太费系统资源了,尤其是在虚拟机在里面装VS2008的时候更是如此. 原因二:有 ...

  9. 集成Visual Studio/MSBuild的开发/发布流程和 FIS3

    谁不想让自己的网站速度更快?为此需要多方面的优化,但优化又会增加开发工作量.Fis3 是很不错的前端优化工具,能够让前端的优化变得自动方便,解决前述问题.Fis3是百度开发的,开源的,在国内比较六流行 ...

  10. 用msbuild构建应用

    msbuild是微软提供的一个用于生成应用程序的平台,你可以通过一个xml配置文件来控制和处理你的软件工程.它也集成到了vs里面,它不依赖于vs. xml配置(架构)的组成元素: 项目文件 属性 项 ...

随机推荐

  1. gnu 扩展之#和##

    转自:http://chongsoft.bokee.com/5816474.html 今天测试了宏定义中的 "#" 和 "##" 的区别. 结果如下: &quo ...

  2. Hibeernate中的两种分页方式

    1. return getHibernateTemplate().executeFind(new HibernateCallback() { public Object doInHibernate(S ...

  3. sgu139Help Needed!推断15数码是否有解,以及推断N数码是否有解的推论

    是这种,要你推断一个15数码是否有解. 我不会,找了这样一个方法. 将16个数按出现顺序存放在一维数组里面, 然后累加每一个数的逆序对数目, 还要加上0到终态的曼哈顿距离,得到一个数x. 因为最后的状 ...

  4. angular.js的路由和模板在asp.net mvc 中的使用

    angular.js的路由和模板在asp.net mvc 中的使用 我们知道angular.js是基于mvc 的一款优秀js框架,它也有一套自己的路由机制,和asp.net mvc 路由不太一样.as ...

  5. 安卓CTS官方文档之兼容性测试套件简介-attach

    官方英文文档原文:https://source.android.com/compatibility/cts-intro.html Compatibility Test Suite  兼容性测试套件 H ...

  6. Asp.net vNext 2

    Asp.net vNext 学习之路(二) View component(视图组件)应该是MVC6 新加的一个东西,类似于分部视图.本文将演示在mvc 6中 怎么添加视图组件以及怎么在视图中注入一个服 ...

  7. hdu5024(dp)

    意甲冠军: 薛期呵和王熙凤不想很接近生活(因为假定他们一起,柴可能取代王熙凤) 现在'.'事情是这样的.'#'一堵墙.薛期呵对宝让生活远: 因此,选择一个最长的公路,让他们住在两端: 路达一个转折点. ...

  8. 使用Clean() 去掉由函数自动生成的字符串中的双引号

    有时候由Excel单元格函数軿凑出来的字符串会自带双引号 效果如下: 想这种这个情况,刚好我们軿凑出来的是SQL语句, 执行的时候是去掉双引号, 这时候可以使用Excel自带的函数来去掉双引号 Cle ...

  9. 《STL源代码剖析》---stl_hash_set.h阅读笔记

    STL仅仅规定接口和复杂度,对于详细实现不作要求.set大多以红黑树实现,但STL在标准规格之外提供了一个所谓的hash_set,以hash table实现.hash_set的接口,hash_tabl ...

  10. 谈谈Oracle dba_free_space

    谈谈Oracle dba_free_space 博客分类: ORACLE管理 OracleSQLC#C++C  顾名思义,dba_free_space指的是Oracle还有多少表空间剩余空间,其视图结 ...