MSBuild的简单介绍与使用

MSBuild 是 Microsoft 和 Visual Studio的生成系统。它不仅仅是一个构造工具,应该称之为拥有相当强大扩展能力的自动化平台。MSBuild平台的主要涉及到三部分:执行引擎、构造工程、任务。其中最核心的就是执行引擎,它包括定义构造工程的规范,解释构造工程,执行“构造动作”;构造工程是用来描述构造任务的,大多数情况下我们使用MSBuild就是遵循规范,编写一个构造工程;MSBuild引擎执行的每一个“构造动作”就是通过任务实现的,任务就是MSBuild的扩展机制,通过编写新的任务就能够不断扩充MSBuild的执行能力。所以这三部分分别代表了引擎、脚本和扩展能力。

构造工程(脚本文件)
先说说构造工程,只要通过Notepad打开任何一个Visual Studio下的C#工程(csproj)文件,就知道构造工程到底是怎么回事了。

<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"><PropertyGroup><Root>$(MSBuildStartupDirectory)</Root></PropertyGroup><Target Name="Build"><!-- Compile --><ItemGroup> <ProjectToBuild Include="$(Root)\..\src\Foundation\Common\Gimela.Common.sln" /><ProjectToBuild Include="$(Root)\..\src\Foundation\Infrastructure\Gimela.Infrastructure.sln" /><ProjectToBuild Include="$(Root)\..\src\Foundation\Management\Gimela.Management.sln" /><ProjectToBuild Include="$(Root)\..\src\Foundation\Security\Gimela.Security.sln" /><ProjectToBuild Include="$(Root)\..\src\Foundation\Tasks\Gimela.Tasks.sln" /><ProjectToBuild Include="$(Root)\..\src\Foundation\Text\Gimela.Text.sln" /><ProjectToBuild Include="$(Root)\..\src\Foundation\Net\Gimela.Net.sln" /><ProjectToBuild Include="$(Root)\..\src\Foundation\ServiceModel\Gimela.ServiceModel.sln" /><ProjectToBuild Include="$(Root)\..\src\Foundation\Data\Gimela.Data.sln" /><ProjectToBuild Include="$(Root)\..\src\Foundation\Presentation\Gimela.Presentation.sln" /><ProjectToBuild Include="$(Root)\..\src\Foundation\Media\Gimela.Media.sln" /><ProjectToBuild Include="$(Root)\..\src\Foundation\Streaming\Gimela.Streaming.sln" />   <ProjectToBuild Include="$(Root)\..\src\Crust\Gimela.Crust.sln" />      </ItemGroup><MSBuild Projects="@(ProjectToBuild)" Targets="Build" Properties="Configuration=Debug;"><Output TaskParameter="TargetOutputs" ItemName="AssembliesBuiltByChildProjects" /></MSBuild></Target>
</Project>

在构造工程中我们可以定义和使用变量(通过Property/PropertyGourp/Item/ItemGroup等元素),可以使用条件分支(通过Choose/When/Otherwise等元素)、能够在运行时给变量赋值(通过执行任务,获取其返回类型参数的方式)、能够定义执行块(通过Target元素,相当于函数)、能够进行异常处理(通过OnError元素)、还可以复用已有工程定义的内容(通过Import元素)。拥有这些能力和高级语言已经相差无几了,所以笔者认为构造工程不是描述性语言,而是脚本语言。

这里还需要强调一点的是,项目级元素(Property)可以在元素下定义,也可以在构造过程中作为外部参数传入,这是一个非常有用的特性,一般编译时选择配置项(Debug或者Release)就是利用这个特性实现的。

Project元素
这是每一个项目文件的最外层元素,它表示了一个项目的范围。如果缺少了这一元素,MSBuild会报错称Target元素无法识别或不被支持。
Project元素拥有多个属性,其中最常用到的是DefaultTargets属性。我们都知道,在一个项目的生成过程中可能需要完成几项不同的任务(比如编译、单元测试、check-in到源代码控制服务器中等),其中每一项任务都可以用Target来表示。对于拥有多个Target的项目,你可以通过设置Project的DefaultTargets(注意是复数)属性来指定需要运行哪(几)个Target,如果没有这个设置,MSBuild将只运行排在最前面的那个Target。

Property元素

在项目中你肯定需要经常访问一些信息,例如需要创建的路径名、最终生成的程序集名称等。以name/value的形式添加进Property,随后就可以以$(PropertyName)的形式访问。这样你就无须为了改动一个文件名称而让整个项目文件伤筋动骨了。比如上面代码中的Bin就是将要创建的路径名称,而AssemblyName则是最终要生成的程序集名称。这些属性的名称不是固定的,你完全可以按自己的习惯来进行命名。在使用时,你需要把属性名称放在”$(“和”)”对内(不包括引号),以表示这里将被替换成一个Property元素的值。
另外,如果Property元素数量比较多,你还可以把它们分门别类地放在不同的PropertyGroup里,以提高代码的可阅读性。这对Property本身没有任何影响。

 <PropertyGroup><Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration><Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform><ProductVersion>8.0.30703</ProductVersion><SchemaVersion>2.0</SchemaVersion><ProjectGuid>{6C2561FB-4405-408F-B41B-ACE5E519A26E}</ProjectGuid><OutputType>Library</OutputType><AppDesignerFolder>Properties</AppDesignerFolder><RootNamespace>Gimela.Infrastructure.Patterns</RootNamespace><AssemblyName>Gimela.Infrastructure.Patterns</AssemblyName><TargetFrameworkVersion>v4.0</TargetFrameworkVersion><FileAlignment>512</FileAlignment></PropertyGroup>

Item元素
在整个项目文件中你肯定要提供一些可被引用的输入性资源(inputs)信息,比如源代码文件、引用的程序集名称、需要嵌入的图标资源等。它们应该被放在Item里,以便随时引用。语法是:<Item Type=”TheType”Include=”NameOrPath” />

其中Type属性可以被看作是资源的类别名称,比如对于.cs源文件,你可以把它们的Type都设置为Source,对于引用的程序集把Type都设置为Reference,这样在随后想引用这一类别的资源时只要引用这个Type就可以了,方法是@(TypeName)。可千万别和Property的引用方法弄混了。
既然Type是资源的类名,那么Include就是具体的资源名称了,比如在上面的示例代码中,Include引用的就是C#源代码文件的名称。你也可以用使用通配符*来扩大引用范围。比如下面这行代码就指定了当前目录下的所有C#文件都可以通过@(Source)来引用:

<Item Type=”Source” Include=”*.cs” />

另外,你也可以通过与PropertyGroup类似的方法把相关的Item放在ItemGroup里。

  <ItemGroup><Reference Include="System" /><Reference Include="System.Core" /><Reference Include="System.Data" /><Reference Include="System.ServiceModel" /><Reference Include="System.Xml" /></ItemGroup><ItemGroup><Compile Include="Commands\CommandBase.cs" /><Compile Include="Commands\DuplexCommandBase.cs" /><Compile Include="Commands\ICommand.cs" /><Compile Include="Commands\IDuplexCommand.cs" /><Compile Include="Extensions\BitConverterExtensions.cs" /><Compile Include="Extensions\ConcurrentDictionaryExtensions.cs" /><Compile Include="Extensions\StopwatchExtensions.cs" /><Compile Include="Extensions\TimeSpanExtensions.cs" /><Compile Include="Flyweight\FlyweightObjectPool.cs" /><Compile Include="Singleton\StaticSingleton.cs" /><Compile Include="Properties\AssemblyInfo.cs" /><Compile Include="SmartQueue\ISmartQueueMapper.cs" /><Compile Include="SmartQueue\SmartQueue.cs" /><Compile Include="SmartQueue\SmartQueueBase.cs" /><Compile Include="SmartQueue\SmartQueueMapper.cs" /><Compile Include="UnitOfWork\IUnitOfWork.cs" /><Compile Include="UnitOfWork\IUnitOfWorkFactory.cs" /><Compile Include="UnitOfWork\UnitOfWork.cs" /><Compile Include="WeakActions\IWeakActionExecuteWithObject.cs" /><Compile Include="WeakActions\WeakAction.cs" /><Compile Include="WeakActions\WeakActionGeneric.cs" /><Compile Include="WeakFuncs\IWeakFuncExecuteWithObjectAndResult.cs" /><Compile Include="WeakFuncs\WeakFunc.cs" /><Compile Include="WeakFuncs\WeakFuncGeneric.cs" /></ItemGroup>

Target元素
Target表示一个需要完成的虚拟的任务单元。每个Project可以包括一个或多个Target,从而完成一系列定制的任务。你需要给每个Target设置一个Name属性(同一Project下的两个Target不能拥有同样的Name)以便引用和区别。

举例来说,在你的项目生成过程中可能需要完成三个阶段的任务:首先check-out源代码,接下来编译这些代码并执行单元测试,最后把它们check-in。那么通常情况下你可以创建三个不同的Target以清晰划分三个不同的阶段:

<Target Name=”CheckOut” ></Target>

<Target Name=”Build”  DependsOnTargets=”CheckOut”> <Task Name=”Build”

.../> <Task Name=”UnitTest” ... />

</Target>

<Target Name=”CheckIn” DependsOnTargets=”CheckOut;Build”> 

</Target>

这样,你就可以非常清晰地控制整个生成过程。为了反应不同Target之间的依赖关系(只有Check-in后才能编译,只有编译完成才可能Check-out……),你需要设置Target的DependsOnTargets属性(注意是复数),以表示仅当这些Target执行完成之后才能执行当前的Target。当MSBuild引擎开始执行某项Target时(别忘了Project的DefaultTargets属性),会自动检测它所依赖的那些Target是否已经执行完成,从而避免因为某个生成环节缺失而导致整个生成过程发生意外。
你可以通过Project的DefaultTargets属性指定MSBuild引擎从哪(几)个Target开始执行,也可以在调用MSBuild.exe时使用t开关来手动指定将要运行的Target,方法如下:
MSBuild /t:CheckOut 这样,只有CheckOut(以及它所依赖的Target,在上文中没有)会被执行。

Task元素
这可能是整个项目文件中最重要的,因为它才是真正可执行的部分(这也是为什么我在上面说Target是虚拟的)。你可以在Target下面放置多个Task来顺序地执行相应的任务。

 

相关文档

  • MSBuild入门
  • MSBuild入门(续)
  • Introduction to MSBuild - Part 1
  • Working with MSBuild - Part 2

转载于:https://www.cnblogs.com/shanyou/p/3452938.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/493662.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

冈萨雷斯《数字图像处理》读书笔记(九)——形态学图像处理

形态学来自于生物学&#xff0c;研究动植物的形态和结构。运用在图像中可提取如边界、骨架和凸壳。初学形态学都是在二值化的图像上研究&#xff0c;之后可以扩展到灰度图像。 膨胀和腐蚀 数学形态学与集合论分不开&#xff0c;因为形态学中的操作是基于两个集合的&#xff0…

云计算行业现状及未来发展趋势

来源&#xff1a;国元证券、乐晴智库摘要&#xff1a;按照服务类型云计算被分为IaaS、PaaS、SaaS。▌云计算产业链构成按照服务类型云计算被分为IaaS、PaaS、SaaS。IaaS基础设施及服务:IaaS主要提供计算基础设施服务&#xff0c;主要包括CPU、内存、存储、网络、虚拟化软件、分…

冈萨雷斯《数字图像处理》读书笔记(三)——空间滤波

滤波这个词来源于频域处理&#xff0c;因为它的目的就是针对频率分量而言的&#xff0c;滤除一定的频率分量。但其实滤波在时域&#xff08;图像中对应为空域&#xff09;中也可以完成相应的操作&#xff0c;比如低通滤波器滤除了代表细节的高频分量&#xff0c;我们可以直接在…

WinInet:HTTPS 请求出现无效的证书颁发机构的处理

首先&#xff0c;微软提供的WinInet库封装了对网页访问的方法。 最近工作需要从https服务器获取数据&#xff0c;都知道https和http网页的访问方式不同&#xff0c;多了一道证书认证程序&#xff0c;这样就使得https在请求起来比http要复杂的多&#xff1b;好在&#xff0c;Win…

热度下的冷思考——智能眼镜到底有没有前途?

来源&#xff1a;环球网我们曾期望Google眼镜能够成为革命性的新产品&#xff0c;因为它某种程度上实现了大家对未来的幻想。然而Google眼镜作为概念产品虽然有趣&#xff0c;但它仍然太不成熟&#xff0c;而且因为存在侵犯隐私的可能还被大众抵触&#xff0c;更重要的是它花去…

TFRecords文件的存储与读取

将cats和dogs两个文件夹各1000张图片存储为&#xff1a;train.tfrecords#将图片文件生成train record import os import tensorflow as tf from PIL import Image #生成cats和dogs的record文件 path./data/train filenamesos.listdir(path) writertf.python_io.TFRecordWriter(…

《C++ Primer》读书笔记 第三章

1.注意&#xff1a;头文件不应包含using声明。因为头文件的内容会拷贝到所有引用他的文件中去&#xff0c;对于某些程序来说&#xff0c;由于不经意间包含了一些名字&#xff0c;可能会产生名字冲突。2.string类型的读入&#xff1a;用cin读入string&#xff0c;忽略所有的前置…

对比激光SLAM与视觉SLAM:谁会成为未来主流趋势?

来源&#xff1a;智车科技摘要&#xff1a;SLAM&#xff08;同步定位与地图构建&#xff09;&#xff0c;是指运动物体根据传感器的信息&#xff0c;一边计算自身位置&#xff0c;一边构建环境地图的过程&#xff0c;解决机器人等在未知环境下运动时的定位与地图构建问题。目前…

链表中的指针

中期答辩改在了国庆之后&#xff0c;终于有时间可以看看剑指offer了。在看到单向链表的部分&#xff0c;对指针&#xff0c;尤其是头指针有点疑惑。首先容易理解的是链表的节点是一个结构体&#xff0c;该结构体包含一个数据&#xff08;一般是int型&#xff09;&#xff0c;还…

实现TFrecords文件的保存与读取

import os import cv2 import numpy as np import tensorflow as tf """ 将train文件夹下的cats和dog文件夹处理成train.tfrecords放在train文件夹里 """ #将图片的路径和对应的标签存储在list中返回 def deal(dir):images []temp []for root,…

工具推荐-css3渐变生成工具

今天工作用到了css3渐变&#xff0c;但是写起来才发现太麻烦了&#xff0c;而却很浪费时间&#xff0c;所以在这里向大家推荐一个在线的css3 渐变生成工具 地址是&#xff1a;http://www.colorzilla.com/gradient-editor/ 这个工具是可视化视图&#xff0c;用起来就和photoshop…

神经网络相关的笔试题目集合(一)

在找工作的过程中发现好多公司没有专门的、传统的图像处理岗位&#xff0c;所以只能参加算法类的笔试甚至AI类的笔试。在AI的笔试中几乎全是关于神经网络的问题&#xff0c;其实也都是很基础的一些问题&#xff0c;如果事先做了准备&#xff0c;可以从容应对。而对于我这种从传…

中美超算“你追我赶” 中国优势可圈可点

来源&#xff1a;新华网摘要&#xff1a;中美超算“你追我赶” 中国优势可圈可点新一期全球超级计算机&#xff15;&#xff10;&#xff10;强榜单&#xff11;&#xff12;日在美国达拉斯发布。与半年前的榜单相比&#xff0c;全球格局变化不大&#xff0c;美国在最快超算上…

吴恩达作业1:逻辑回归实现猫的分类

思路&#xff1a;输入样本X与随机初始权重W相乘&#xff0c;利用sigmoid激活函数输出值&#xff0c;对于二分类问题&#xff0c;用交叉熵损失函数来计算损失值&#xff0c;通过交叉熵损失函数利用链式法则求出W和b的偏导&#xff0c;梯度下降更新W和b即可&#xff0c;&#xff…

《转》不要过打折的生活,当你发现这些你有了,说明你开始成熟了

我在一家外企工作的时候&#xff0c;有一天陪女上司上街选购圣诞礼物。当我们拎着大包小包坐下喝咖啡时&#xff0c;女上司问我&#xff1a;“新年要到了&#xff0c;不买点礼物送给家人&#xff1f;”我笑着说&#xff1a;“我爸妈都很节省&#xff0c;只有不乱花钱&#xff0…

双摄与双目视觉

越来越多的手机开始上双摄&#xff0c;首先解释一下双摄的目的&#xff0c;双摄可以达到什么样的效果。首先双摄可以分为两类&#xff0c;一类是利用双摄获得图像中物体到镜头或者焦距的距离&#xff0c;得到景深信息就可以进行后续的3D重建、图像分割、背景虚化等&#xff1b;…

“脑补”的科学依据:眼前的黑不是黑,靠得是你的大脑

一个在眨眼的婴儿 | 图片来源&#xff1a;Leungcho Pan/Shutterstock撰文&#xff1a;Mindy Weisberger来源&#xff1a;科研圈编译&#xff1a;向菲菲人们常说&#xff1a;“别眨眼&#xff0c;精彩稍纵即逝。”但其实在我们眨眼的时候&#xff0c;精彩仍在我们眼前上演。我们…

基于Sql Server 2008的分布式数据库的实践(三)

配置PHP 1.打开PHP配置文件&#xff0c;找到extensionphp_mssql.dll&#xff0c;将前面的注释符号去掉 2.找到mssql.secure_connection&#xff0c;将Off改为On 3.找到com.allow_dcom true&#xff0c;将前面的注释符号去掉 4.下载正确版本的 ntwdblib.dll (2000.80.194.0)&am…

ORB论文研读与代码实现

首先&#xff0c;ORB算法来自于OpenCV Labs&#xff0c;相比于SIFT和SURF&#xff0c;ORB在使用中不必担心专利的问题。但同时ORB在保证了一定性能的条件下做到了高效。在论文《ORB: An efficient alternative to SIFT or SURF》2011中&#xff0c;ORB在特征点检测和描述子生成…

腾讯发布人工智能辅助翻译,致敬人工翻译

来源&#xff1a;腾讯AI实验室11月13日&#xff0c;深圳 - 腾讯AI Lab今日发布了一款AI辅助翻译产品 - “腾讯辅助翻译”&#xff08;Transmart&#xff09;&#xff0c;可满足用户快速翻译的需求&#xff0c;用AI辅助人工翻译提高效率和质量。该产品采用业内领先的人机交互式机…