MSBuild基本概念(续)

在上一篇简单的介绍了下MSBuild中的四个基本块,每块介绍比较单薄,在这里对在大多数的项目模版生成的*.*proj文件中比较常见一些用法和概念做些补充。主要有一下几方面:

MSBuild特殊字符:MSBuild保留的一些字符,以及XML中的特殊字符处理。

MSBuild条件: Condition特性,作用类似于C#的if。

MSBuild属性: 使用环境变量、保留属性、全局属性。

MSBuild任务: ITask接口、UsingTask[自定义任务]、ContinueOnError。

MSBuild目标: 初始目标、默认目标、目标依赖项。

Import元素: 导入项目文件到当前项目文件。

MSBuild特殊字符

一些字符在MSBuild中代表着特殊的上下文含义,如下:

MSBuild的特殊字符[%引用元数据]、[$引用属性]、[@引用项]、['条件或其他表达式]、[;列表分隔符]、[?文件名通配符]、[*文件名通配符];

XML的保留字符:、&、"、'

针对MSBuild的特殊字符转义需要用[%xx]这种方式,xx代表字符的ASCII十六进制值([%=%25][$=%24][@=%40]['=%27][;=%3B][?=%3F][*=%2A])。针对XML保留字符则使用&lt这种方式。 一般用到这些特殊字符的情况不多,见到时能知道是转义就可以了。

MSBuild条件

条件在*.*proj项目文件中非常常见,用Condition特性来表示一个布尔表达式,类似于if条件,几乎所有的元素都可以具有Conditon特性。一个简单的例子如下:

1 <?xml version="1.0" encoding="utf-8"?>

2

3

4

5

6

7 Debug

8 x86

9

10

11

12

13

14

15

16

17

18

19

20

还有一些常用的表达式如!=、!、And、Or等。

MSBuild属性

上篇介绍到可以用$可以引用自定义的属性,除此之外亦可以引用系统的环境变量,如$(Path),以及 MSBuild保留属性(MSDN)。

属性除了可以在项目文件中声明是赋值外,在MSBuild命令行也允许设置属性的值(语法:/p:propertyName=value)。称作全局属性,这类属性会重写在项目文件中设置的属性值,保留属性除外的任何属性都可被这种方式覆盖其原值。 以上面示例为基础:[MSBuild condition.xml /p:Platform=x64],则最终输出结果就为Debug|x64了。

属性还有一种叫做任务发出属性,在上篇用到了,由Output元素的PropertyName特性指定了属性名,这类属性不像一般的声明式属性那样赋值,而是动态得到的值。是在项目文件中很常见的用法。

MSBuild项

项大都是用来引入文件用的,而文件会有一些附加信息,比如版本,语言等,而这些附加信息在项目文件中是以项的子元素的出现的,称为项的元数据。元数据是键/值的形式存储的,声明方式和属性相同。

1

2

3

4

5

6 zh-cn

7

8

除了自定义的一些元数据外,系统还提供一些隐式存在的元数据,即不用声明即可使用,具体可参见

项转换允许把一个项的列表与另一个列表一一变换。比如下面的例子:

1 >

5

6

7 '%(Filename).vb')"/>

8

9

10

11

12

13

14

15

MSBuild任务

从上篇中我们对任务的认识是它是一个原子操作,用来执行某一项逻辑处理,但是xml格式的项目文件是没有这个处理能力的,所以这些任务都是映射到.NET类库中的一些类,由这些类来处理操作中的逻辑。具体来说都是实现ITask接口的类,ITask接口位于Microsoft.Build.Framework命名空间。当然我们也可以实现自己的任务类,直接实现ITask接口或者继承自Task(此抽象类实现了ITask接口的部分功能,可简化自定义任务类的编写,留出一个Execute抽象方法供子类重写自己的任务逻辑)。然后通过UsingTask元素映射到出一个任务元素。我就继承Task写一个简单的示例:

1 //AddTwoNumberTask.cs,需编译为dll

2 usingSystem;3 usingMicrosoft.Build.Utilities;4 usingMicrosoft.Build.Framework;5

6 ///

7 ///继承Task,任务逻辑是处理加法8 ///

9 public classAddTwoNumberTask : Task10 {11 ///

12 ///定义一个加数,13 ///如果一个输入属性被要求必须输入,则用[Required]特性标识该属性14 ///

15 public String Number1 { get; set; }16 ///

17 ///定义另一个加数18 ///

19 public String Number2 { get; set; }20 public override boolExecute()21 {22 this.Sum = (Int32.Parse(this.Number1) + Int32.Parse(this.Number2)).ToString();23 return true;24

25 }26 ///

27 ///定义一个输出参数,使用Output特性修饰该属性28 ///

29 [Output]30 public String Sum { get; set; }31 }

然后编写如下项目文件,放于AddTwoNumberTask.cs同目录下:

1

2 <?xml version="1.0" encoding="utf-8"?>

3

4

5

6 Library

7

8

9

10

11

12

13

14

15

16

17

18

19 References="@(Reference->'$(MSBuildBinPath)\%(Identity).dll')"

20 TargetType="$(OutputType)">

21

22

23

用MSBuild编译buildAddTaskDll.csproj项目文件。得到AddTwoNumberTask.dll程序集。再编写一个项目文件usingtask如下:

如果仔细看AddTwoNumberTask.cs文件就会发现

//如果Number1或者2不是数字,则此任务就会抛异常了

this.Sum = (Int32.Parse(this.Number1) + Int32.Parse(this.Number2)).ToString();

那么如果在这里加一个ContinueOnError=“true”,则表示会忽略掉逻辑处理中的错误,继续运行,否则会终止执行后续任务。如果任务有输出参数的话,Output元素总是作为任务的子元素出现,作为一个中间桥梁把任务的输出传输到属性或者项中。

MSBuild目标

Project根元素代表者一个项目文件,上面的例子我都会写一个DefaultTargets特性来指定该项目文件要执行的默认目标是哪一个。其实此特性是可选的,也是可以用分号分割写多个的,执行顺序依据书写顺序来判定,也可通过MSBuild命令行参数来传递:

msbuild /target:Build1;Build2

除此之外,Project元素还有一个可选特性InitialTargets,也支持多个目标。如果这两个特性都没有,则MSBuild先执行它遇到的第一个Target。Target有一个DependsOnTargets特性表示当前目标依赖另一个目标,效果就是DependsOnTargets特性指定的目标先于当前目标执行。这绕来绕去好多先后顺序关系,写一个示例看看吧。

1 <?xml version="1.0" encoding="utf-8"?>

2

3

4

5

6 ToolsVersion="4.0"xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

Import元素

项目模版产生的*.*proj项目文件大量的使用这个元素,用来导入可重用的项目文件,其中最常见的一个应该是这个吧,如果你用C#开发的话。

MSBuildToolsPath或者是MSBuildBinPath,Project特性指定要导入的项目文件。Import元素像是一个占位元素,MSBuild在执行到此时会用*.targets替换掉此元素,就像本来就声明在这里一样,所以和*.targets文件有关的所有保留属性会被重置。 Import元素对导入文件的扩展名无要求,文件是正确的项目文件就行,但一般约定为*.targets。

总结和备注

了解了以上知识点后,阅读一般的项目模版生成的项目文件(*.*proj)应该是可以的了,下篇文章先认识几个重要的*.targets,为剖析项目文件做准备。

备注:针对项目文件中所指的“特性”是表示一个xml元素的“属性”。由于属性在MSBuild中有特殊含义,则MSDN文档一律把项目文件中的xml属性称作是特性,比如Message任务的Text特性。如有错误之处,欢迎指正!

msbuild 语法_MSBuild入门(续)相关推荐

  1. msbuild 语法_msbuild 中文说明文档

    Microsoft (R) 生成引擎版本 14.0.25420.1 版权所有(C) Microsoft Corporation.保留所有权利. 语法: MSBuild.exe [选项] [项目文件] ...

  2. msbuild 语法_MSBuild - Visual Studio | Microsoft Docs

    MSBuildMSBuild 11/04/2016 本文内容 Microsoft 生成引擎是一个用于生成应用程序的平台.The Microsoft Build Engine is a platform ...

  3. msbuild 语法_MSBuild Command-Line Reference

    MSBuild Command-Line Reference 11/15/2016 8 分钟可看完 本文内容 Note This article applies to Visual Studio 20 ...

  4. msbuild 语法_MSBuild 命令行参考

    为文件记录器和分布式文件记录器指定任何额外参数.Specifies any extra parameters for the file logger and the distributed file ...

  5. msbuild 语法_MSBuild 编译asp.net 命令写法

    本人使用的是framework4.5 visual studio 2015开发的项目 build命令如下 cd /d D:\work\Test C:\Windows\Microsoft.NET\Fra ...

  6. msbuild 语法_MSBuild 命令参数

    Build a Visual Studio project or solution using MSBuild Command Line Arguments  常用命令行参数 详解: MSBuild ...

  7. [独孤九剑]持续集成实践(二)– MSBuild语法入门

    本系列文章包含: [独孤九剑]持续集成实践(一)- 引子 [独孤九剑]持续集成实践(二)– MSBuild语法入门 [独孤九剑]持续集成实践(三)- Jenkins安装与配置(Jenkins+MSBu ...

  8. python编程基础语法-Python编程基础语法快速入门

    1. 课程咨询加老师助理微信:助理1微信: chenjinglei88 ,助理2微信: omf6757 2. 决定购买并想得到陈敬雷老师亲自指导(课程或自己项目难题均可)加老师微信: chenjing ...

  9. Freemarker的基本语法及入门基础

    freemarker的基本语法及入门基础 一.freemarker模板文件(*.ftl)的基本组成部分         1. 文本:直接输出的内容部分         2. 注释:不会输出的内容,格式 ...

最新文章

  1. 异常处理机制(Begin try Begin Catch)
  2. sed 替换_Linux中sed的用法
  3. Android 开源项目集合
  4. vue中的v-model原理,与组件自定义v-model
  5. think php a方法,PHP_ThinkPHP之A方法实例讲解,ThinkPHP的A方法用于在内部实例 - phpStudy...
  6. UE4 集成讯飞听写插件
  7. 数据科学还是计算机科学_您应该拥有数据科学博客的3个原因
  8. 【VBS】归纳 Visual Basic Script 内置函数
  9. SAP License:SAP一个成功的案例之跳槽者必看
  10. loadrunner 一个诡异问题
  11. 七月算法机器学习 (16)人工神经网络
  12. 《啊哈算法》知识点总结
  13. python人脸检测与微信小程序_[源码和文档分享]基于深度学习Python实现的支持人脸识别和情绪分类的社区APP网站和微信小程序...
  14. java 文件zip打包下载 多个文件夹分类
  15. MySQL初始密码的查看
  16. 做工作必须将心比心——感谢译者陈浩对我们的批评
  17. intel edison 设置wifi自动连接
  18. CSS display 属性详解
  19. gii无法访问 yii2_YII2框架访问gii、debug页面404的错误解决方法
  20. 小魔推如何解决实体商家痛点,实现短视频高转化

热门文章

  1. 滴答顺风车怎么抢90%以上的订单_顺风车这样做才是对的,其他都是扯淡!
  2. Qt之开源绘图控件QCustomPlot
  3. 景联文科技:语音工程系列(一)——语音标注的应用场景
  4. 算法为什么那么难?——算法学习秘籍
  5. 合并多个HEX文件的方法
  6. 十多家大厂Android面试真题锦集干货整理,成功拿下大厂offer
  7. 电力:发电公司如何构建自己的数据仓库
  8. 计算机辅助绘制地图是数字图像,基于遥感数字图像的电子教学地图的制作.pdf...
  9. 地磁北极移动加快,地磁模型紧急更新;微信小程序“老赖地图”上线
  10. MOOC-浙江大学-博弈论基础-学习笔记(七)