大雀软件园

首页 软件下载 安卓市场 苹果市场 电脑游戏 安卓游戏 文章资讯 驱动下载
技术开发 网页设计 图形图象 数据库 网络媒体 网络安全 站长CLUB 操作系统 媒体动画 安卓相关
当前位置: 首页 -> 技术开发 -> NET专区 -> MSBuild入门

MSBuild入门

时间: 2021-07-31 作者:daque

即使你和我一律从来都在用nant处置天生进程的话,那么你确定会莫大关心msbuild。因为很大略,由于它属于微软,你不妨不爱好它,但你确定要学会用它。在熬过了几个黄昏此后,我毕竟让本人符合了msbuild的语法。这可真不简单,更加是当本人仍旧风气了nant的小写典型之后。然而这不可题目,由于跟着本人对msbuild的领会一点点加深,本人还真的爱好上它了。好吧,底下就让我来大略地引见一下我在进修msbuild运用进程中的一点体味。即使你还在msbuild的大门外徜徉,那么蓄意这篇货色能带你加入那扇门。筹备处事开始要提到的是相关怎样运用msbuild的少许要害资源。它们是:1. alex kipman的msdntv show:http://msdn.microsoft.com/msdntv/episode.aspx?xml=episodes/en/20040122vsnetak/manifest.xml2. alex kipman和rajeev goel在pdc2003上的报告:http://microsoft.sitestream.com/pdc2003/tls/tls347.htm上头这两项出自msbuild开拓组的alex kipman,从表面上说他该当是领会msbuild的第一人,他给出的几个演练简直给了我特殊大的扶助。(然而我特殊不爱好他的声响,又尖又细。)3. msbuild dochttp://msdn.microsoft.com/longhorn/toolsamp/default.aspx这是最要害的,个中囊括alex kipman编缉的五份要害文书档案:msbuildfileformat、msbuildwalkthrough、msbuildtasks、howtowriteatask以及msbuildcommandline。这大概是暂时情景下外界能赢得的相关msbuild最精细的文书档案。demo好了,十足筹备处事停当,让咱们以一个大略的示例发端吧。开始写一个大略的c# console步调(你也不妨把它改成vb.net):// hellomsbuild.csusing system;class hellomsbuild { public static void main() { console.writeline("hello msbuild!"); } }底下咱们就要写一个.csproj文献来遏制所有天生进程。犯得着提防的是,即使在挪用msbuild.exe时没有指定简直的名目文献,msbuild引擎会在暂时目次下搜索一个名为*.*proj的名目文献。即使你在同一目次中写了多个如许的名目文献,那么须要手动指定msbuild.exe的目的文献,本领是:msbuild a.csproj要不msbuild会提醒堕落,诉求你手动指定目的名目文献。以次是名目文献:<!-- build.csproj --><project defaulttargets="run"> <property bin="bin" /> <property outputassembly="hellomsbuild" /> <item type="source" include="hellomsbuild.cs" /> <target name="build"> <task name="makedir" directories="$(bin)" condition="!exists('$(bin)')" /> <task name="csc" sources="@(source)" targettype="exe" outputassembly="$(bin)\$(outputassembly).exe" /> </target> <target name="run" dependsontargets="build"> <task name="exec" command="$(bin)\$(outputassembly).exe" /> </target></project>即使你此前没有过nant的开拓体味,那么上头那些货色确定看上去挺吓人。这个功夫最佳的方法是翻开那篇msbuildfileformat,比较上头代码搜索相映的名目元素的含意。底下我对个中要害的名目元素举行一下证明。1. project元素。这是每一个名目文献的最外层元素,它表白了一个项手段范畴。即使缺乏了这一元素,msbuild会报错称target元素没辙辨别或不被扶助。project元素具有多个属性,个中最常用到的是defaulttargets属性。咱们都领会,在一个项手段天生进程中大概须要实行几项各别的工作(比方编写翻译、单位尝试、check-in到源代码遏制效劳器平淡),个中每一项工作都不妨用target来表白。对于具有多个target的名目,你不妨经过树立project的defaulttargets(提防是复数)属性来指定须要运转哪(几)个target,比方:<project defaulttargets=”build” >...大概:<project defaulttargets=”build;test;run” >...即使没有这个树立,msbuild将只运转排在最前方的谁人target。2. property元素。在名目中你确定须要常常考察少许消息,比方须要创造的路途名、最后天生的步调集称呼等。那些消息你最佳别hard code进名目中,只有你一次写过之后永不变动。这时候property就能派上用途了。你把上头提到的那些消息以name/value的情势增添进property,随后就不妨以$(propertyname)的情势考察。如许你就不必为了变换一个文献称呼而让所有名目文献扭伤了。比方上头代码中的bin即是将要创造的路途称呼,而assemblyname则是最后要天生的步调集称呼。那些属性的称呼不是恒定的,你实足不妨按本人的风气来举行定名。在运用时,你须要把属性称呼放在”$(“和”)”对外(不囊括引号),以表白这边将被替代成一个property元素的值。其余,即使property元素数目比拟多,你还不妨把它们分门别类地放在各别的propertygroup里,以普及代码的可观赏性。这对property自己没有任何感化。比方:<propertygroup> <property ... /> <property ... /></propertygroup>3. 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里。4. target元素。上头仍旧提到了,target表白一个须要实行的假造的工作单位。每个project不妨囊括一个或多个target,进而实行一系列定制的工作。你须要给每个target树立一个name属性(同一project下的两个target不许具有同样的name)再不援用和辨别。举例来说,在你的名目天生进程中大概须要实行三个阶段的工作:开始从vss中check-out源代码,接下来编写翻译那些代码并实行单位尝试,结果把它们check-in回vss。那么常常情景下你不妨创造三个各别的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,在下文中没有)会被实行。5. task元素。这大概是所有名目文献中最要害的,由于它才是真实可实行的局部(这也是干什么我在上头说target是假造的)。你不妨在target底下安置多个task来程序地实行相映的工作,比方我在上头示例代码中就在两个各别的target中安置了makedir、csc和exec三个各别的task。那些task经过name属性来彼此辨别,并各自具有各别的其它属性来实行各别的工作,比方csc有sources(源代码文献)、targettype(目的典型)、outputassembly(天生步调集称呼)等属性,而makedir则只需树立directories(须要创造的路途称呼列表)即可。大概你会怪僻那些task的称呼和属性从何处来。好吧,请用文本编写翻译器翻开%windir%\microsoft.net\framework\v1.2.30703\microsoft.buildtasks文献,看到了吗?默许情景下内里该当是如许的(各别的本子大概会有纤细分辨):<!-- this file lists all the tasks that ship by default with msbuild --><defaulttasks> <usingtask taskname="microsoft.build.tasks.csc" assemblyname="msbuildtasks"/> <usingtask taskname="microsoft.build.tasks.msbuild" assemblyname="msbuildtasks"/> <usingtask taskname="microsoft.build.tasks.exec" assemblyname="msbuildtasks"/> <usingtask taskname="microsoft.build.tasks.vbc" assemblyname="msbuildtasks"/> <usingtask taskname="microsoft.build.tasks.makedir" assemblyname="msbuildtasks"/> <usingtask taskname="microsoft.build.tasks.resgen" assemblyname="msbuildtasks"/> <usingtask taskname="microsoft.build.tasks.copy" assemblyname="msbuildtasks"/> <usingtask taskname="microsoft.build.tasks.netassemblyresolver" assemblyname="msbuildtasks"/> <usingtask taskname="microsoft.build.tasks.transformpath" assemblyname="msbuildtasks"/> </defaulttasks>你会提防到,在defaulttasks元素底下陈设的全是usingtask,个中指明每一个task的taskname(称呼)和assemblyname(步调集)。比方说第一个usingtask就对应着咱们上头用过的csc工作,它的完备称呼(namespace+class)是microsoft.build.tasks.csc,坐落msbuildtasks.dll步调会合(请在同一目次下确认这一.dll文献的生存)。如许,msbuild引擎在遇到对csc工作的挪用时就会经过这边的备案消息来决定csc地方的步调集,进而最后运转相映的托管代码。如许,即使你本人也写了各别的task,请按同样的办法对它举行备案再不运用。即使你援用了一个还没有备案的target,那么msbuild引擎将没辙找到它的生存而引导天生波折。固然,msbuild task的备案办法不只之上一种。之上备案本领的感化范畴是全部,你不妨在每一个project里运用上头备案的那些task。但你也不妨采用在project范畴内备案task,这将对应着其余一种略有各别的本领。我会在反面的一篇作品里给出简直引见。在这边,你只需领会你所须要的task在何处找到,而它们的简直用法不妨经过参考msbuildtasks一文来赢得,在这边我就不细说了。ok,引见了一长串,仍旧快点把咱们的build.csproj运转起来吧。请在shell的同一目次下输出以次吩咐:msbuild大概:msbuild build.csproj运转截止如次:d:\dev\mymsbuilddemo>msbuild build.csprojmsbuild build.csprojmicrosoft (r) .net build engine version 1.2.30703.4[microsoft .net framework, version 1.2.30703.4] copyright (c) microsoft corporation 2003. all rights reserved.target "build" in project "build.csproj" task "makedir" creating directory "bin". task "csc" csc.exe /out:"bin\hellomsbuild.exe" /target:exe "hellomsbuild.cs"target "run" in project "build.csproj" task "exec" hello msbuild!看来,在build.csproj指定的两个target和三个task均按相映的程序顺序运转,在csc实行时msbuild还表露出了暂时实行的简直吩咐,而在从来的visual studio .net岁月,你是没辙获知暂时正在实行的编写翻译吩咐是什么(据alex kipman称,连visual studio .net本人也不领会正在实行的简直吩咐,由于那些吩咐仍旧被hard code进了“黑匣子”,基础没辙索取)。好了,一个大略的msbuild文献用法示例就到这边了。即使你此前还没交战过msbuild大概nant,那么蓄意这篇作品能让你对msbuild的用法有个发端的领会。再有很多的详细我在文中没有波及,即使你感爱好的话就请载入前方我提到的那些msbuild文书档案来本人接洽吧。我会鄙人一篇作品里引见怎样开拓本人的msbuild task。

热门阅览

最新排行

Copyright © 2019-2021 大雀软件园(www.daque.cn) All Rights Reserved.