zl程序教程

您现在的位置是:首页 >  后端

当前栏目

.NET魔法堂:工程构建基石->MSBuild

Net 构建 gt 工程 魔法 -& 基石
2023-09-14 08:58:00 时间

一、前言

  MSBuild是一个既熟悉又陌生的名字,Visual Studio的项目加载和构建均通过MSBuild来实现。VS中右键打开项目菜单,对应MSBuild的Build目标,对应MSBuild的Rebuild目标,对应MSBuild的Clean目标,对 应MSBuild的PublishOnly目标。到这里我想大家都明白MSBuild就和Ant一样就是一个用于项目构建的任务执行引擎,只不过它被融入 到VS中,降低了入门难度。但融入VS中只是方便我们使用而已,并不代表不用了解学习,尤其项目规模愈发庞大时,编写结构良好的MSBuild Script来作为项目构建和管理的基石是必不可少。

  本文是近日的学习记录,学习目标是看懂*.csproj项目文件的信息。若有纰漏请大家指正,谢谢。

  附件知识 :

*.sln             :  项目、解决方案在磁盘上的引用,VS通过该类文件加载整个项目、解决方案;

*.suo           : 保存VS用户界面的自定义配置(包括布局、断电和项目最后编译后而又没有关闭的文件标签等),下一次打开VS时会恢复这些配置;

*.csproj.user: 保存VS的个人配置;

*.csproj       : XML格式,保存项目的依赖项和项目构建步骤、任务等。(需要上传到版本库的)

  注意:以下内容均以.NET Framework 4.0为环境。

  目录一大坨:

  二、MSBuild的组成

  三、从实例学MSBuild Script

1. Project元素

2. ItemGroup/Item元素

3. PropertyGroup/Property元素 

4. Task元素

5. UsingTask元素 

6. Target元素

7. Choose元素

8. Import元素

   9. ProjectExtensions元素

  四、特殊字符

  五、Condition的属性形式

  六、通配符

  七、生成解决方案中的特定目标

  八、小结

  九、参考

  

 

二、MSBuild的组成  

  MSBuild由两部分组成:脚本 和 执行引擎。

  脚本:就是带变量、函数、流程控制的可编程语言。MSBuild Script是基于XML schema的,和Ant、Maven等差不多。

  执行引擎:以脚本、变量、环境变量作为输入,对脚本进行解析执行。

 

、从实例学MSBuild Script

  直接到MSDN学习是一个不错的选择,但为了降低学习难度我们以**.csproj项目文件作为切入点。

  在VS2013下新建名为LearnMSBuild的MVC4项目,然后在项目目录下有LearnMSBuild.csproj和LearnMSBuild.csproj.user两个项目文件,而里面就是MSBuild Script了。

  在VS中查看LearnMSBuild.csproj的方法:右键点击项目- 卸载项目- 右键点击项目- 编辑LearnMSBuild.csproj。

 ?xml version="1.0" encoding="utf-8"? 

 Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" 

 Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists($(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props)" / 

 PropertyGroup 

 Configuration Condition=" $(Configuration) ==  " Debug /Configuration 

 Platform Condition=" $(Platform) ==  " AnyCPU /Platform 

 ProductVersion 

 /ProductVersion 

 SchemaVersion 2.0 /SchemaVersion 

 ProjectGuid {13508D65-AC7D-4462-9106-2E8EC81F677D} /ProjectGuid 

 ProjectTypeGuids {E3E379DF-F4C6-4180-9B81-6769533ABE47};{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc} /ProjectTypeGuids 

 OutputType Library /OutputType 

 AppDesignerFolder Properties /AppDesignerFolder 

 RootNamespace MvcApplication1 /RootNamespace 

 AssemblyName MvcApplication1 /AssemblyName 

 TargetFrameworkVersion v4.0 /TargetFrameworkVersion 

 MvcBuildViews false /MvcBuildViews 

 UseIISExpress true /UseIISExpress 

 IISExpressSSLPort / 

 IISExpressAnonymousAuthentication / 

 IISExpressWindowsAuthentication / 

 IISExpressUseClassicPipelineMode / 

 /PropertyGroup 

 PropertyGroup Condition=" $(Configuration)|$(Platform) == Debug|AnyCPU " 

 DebugSymbols true /DebugSymbols 

 DebugType full /DebugType 

 Optimize false /Optimize 

 OutputPath bin\ /OutputPath 

 DefineConstants DEBUG;TRACE /DefineConstants 

 ErrorReport prompt /ErrorReport 

 WarningLevel 4 /WarningLevel 

 /PropertyGroup 

 PropertyGroup Condition=" $(Configuration)|$(Platform) == Release|AnyCPU " 

 DebugType pdbonly /DebugType 

 Optimize true /Optimize 

 OutputPath bin\ /OutputPath 

 DefineConstants TRACE /DefineConstants 

 ErrorReport prompt /ErrorReport 

 WarningLevel 4 /WarningLevel 

 /PropertyGroup 

 ItemGroup 

 Reference Include="Microsoft.CSharp" / 

 Reference Include="System" / 

 Reference Include="System.Data" / 

 Reference Include="System.Data.Entity" / 

 Reference Include="System.Drawing" / 

 Reference Include="System.Web.DynamicData" / 

 Reference Include="System.Web.Entity" / 

 Reference Include="System.Web.ApplicationServices" / 

 Reference Include="System.ComponentModel.DataAnnotations" / 

 Reference Include="System.Core" / 

 Reference Include="System.Data.DataSetExtensions" / 

 Reference Include="System.Xml.Linq" / 

 Reference Include="System.Web" / 

 Reference Include="System.Web.Extensions" / 

 Reference Include="System.Web.Abstractions" / 

 Reference Include="System.Web.Routing" / 

 Reference Include="System.Xml" / 

 Reference Include="System.Configuration" / 

 Reference Include="System.Web.Services" / 

 Reference Include="System.EnterpriseServices" / 

 Reference Include="EntityFramework" 

 HintPath ..\packages\EntityFramework.5.0.0\lib\net40\EntityFramework.dll /HintPath 

 /Reference 

 Reference Include="Microsoft.Web.Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" 

 Private True /Private 

 HintPath ..\packages\Microsoft.Web.Infrastructure.1.0.0.0\lib\net40\Microsoft.Web.Infrastructure.dll /HintPath 

 /Reference 

 Reference Include="Microsoft.Web.Mvc.FixedDisplayModes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" 

 Private True /Private 

 HintPath ..\packages\Microsoft.AspNet.Mvc.FixedDisplayModes.1.0.0\lib\net40\Microsoft.Web.Mvc.FixedDisplayModes.dll /HintPath 

 /Reference 

 Reference Include="Newtonsoft.Json" 

 HintPath ..\packages\Newtonsoft.Json.4.5.11\lib\net40\Newtonsoft.Json.dll /HintPath 

 /Reference 

 Reference Include="System.Net.Http" 

 Private True /Private 

 HintPath ..\packages\Microsoft.Net.Http.2.0.30506.0\lib\net40\System.Net.Http.dll /HintPath 

 /Reference 

 Reference Include="System.Net.Http.Formatting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" 

 HintPath ..\packages\Microsoft.AspNet.WebApi.Client.4.0.30506.0\lib\net40\System.Net.Http.Formatting.dll /HintPath 

 /Reference 

 Reference Include="System.Net.Http.WebRequest" 

 Private True /Private 

 HintPath ..\packages\Microsoft.Net.Http.2.0.30506.0\lib\net40\System.Net.Http.WebRequest.dll /HintPath 

 /Reference 

 Reference Include="System.Web.Http, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" 

 HintPath ..\packages\Microsoft.AspNet.WebApi.Core.4.0.30506.0\lib\net40\System.Web.Http.dll /HintPath 

 /Reference 

 Reference Include="System.Web.Http.WebHost, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" 

 HintPath ..\packages\Microsoft.AspNet.WebApi.WebHost.4.0.30506.0\lib\net40\System.Web.Http.WebHost.dll /HintPath 

 /Reference 

 Reference Include="System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" 

 Private True /Private 

 HintPath ..\packages\Microsoft.AspNet.Mvc.4.0.30506.0\lib\net40\System.Web.Mvc.dll /HintPath 

 /Reference 

 Reference Include="System.Web.Optimization" 

 HintPath ..\packages\Microsoft.AspNet.Web.Optimization.1.0.0\lib\net40\System.Web.Optimization.dll /HintPath 

 /Reference 

 Reference Include="System.Web.Providers" 

 HintPath ..\packages\Microsoft.AspNet.Providers.Core.1.2\lib\net40\System.Web.Providers.dll /HintPath 

 /Reference 

 Reference Include="System.Web.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" 

 Private True /Private 

 HintPath ..\packages\Microsoft.AspNet.Razor.2.0.30506.0\lib\net40\System.Web.Razor.dll /HintPath 

 /Reference 

 Reference Include="System.Web.WebPages, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" 

 Private True /Private 

 HintPath ..\packages\Microsoft.AspNet.WebPages.2.0.30506.0\lib\net40\System.Web.WebPages.dll /HintPath 

 /Reference 

 Reference Include="System.Web.WebPages.Deployment, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" 

 Private True /Private 

 HintPath ..\packages\Microsoft.AspNet.WebPages.2.0.30506.0\lib\net40\System.Web.WebPages.Deployment.dll /HintPath 

 /Reference 

 Reference Include="System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" 

 Private True /Private 

 HintPath ..\packages\Microsoft.AspNet.WebPages.2.0.30506.0\lib\net40\System.Web.WebPages.Razor.dll /HintPath 

 /Reference 

 Reference Include="WebGrease" 

 Private True /Private 

 HintPath ..\packages\WebGrease.1.3.0\lib\WebGrease.dll /HintPath 

 /Reference 

 Reference Include="Antlr3.Runtime" 

 Private True /Private 

 HintPath ..\packages\WebGrease.1.3.0\lib\Antlr3.Runtime.dll /HintPath 

 /Reference 

 /ItemGroup 

 ItemGroup 

 Compile Include="App_Start\BundleConfig.cs" / 

 Compile Include="App_Start\FilterConfig.cs" / 

 Compile Include="App_Start\RouteConfig.cs" / 

 Compile Include="App_Start\WebApiConfig.cs" / 

 Compile Include="Global.asax.cs" 

 DependentUpon Global.asax /DependentUpon 

 /Compile 

 Compile Include="Properties\AssemblyInfo.cs" / 

 /ItemGroup 

 ItemGroup 

 Content Include="Content\themes\base\images\ui-bg_flat_0_aaaaaa_40x100.png" / 

 Content Include="Content\themes\base\images\ui-bg_flat_75_ffffff_40x100.png" / 

 Content Include="Content\themes\base\images\ui-bg_glass_55_fbf9ee_1x400.png" / 

 Content Include="Content\themes\base\images\ui-bg_glass_65_ffffff_1x400.png" / 

 Content Include="Content\themes\base\images\ui-bg_glass_75_dadada_1x400.png" / 

 Content Include="Content\themes\base\images\ui-bg_glass_75_e6e6e6_1x400.png" / 

 Content Include="Content\themes\base\images\ui-bg_glass_95_fef1ec_1x400.png" / 

 Content Include="Content\themes\base\images\ui-bg_highlight-soft_75_cccccc_1x100.png" / 

 Content Include="Content\themes\base\images\ui-icons_222222_256x240.png" / 

 Content Include="Content\themes\base\images\ui-icons_2e83ff_256x240.png" / 

 Content Include="Content\themes\base\images\ui-icons_454545_256x240.png" / 

 Content Include="Content\themes\base\images\ui-icons_888888_256x240.png" / 

 Content Include="Content\themes\base\images\ui-icons_cd0a0a_256x240.png" / 

 Content Include="Content\themes\base\jquery-ui.css" / 

 Content Include="Content\themes\base\jquery.ui.accordion.css" / 

 Content Include="Content\themes\base\jquery.ui.all.css" / 

 Content Include="Content\themes\base\jquery.ui.autocomplete.css" / 

 Content Include="Content\themes\base\jquery.ui.base.css" / 

 Content Include="Content\themes\base\jquery.ui.button.css" / 

 Content Include="Content\themes\base\jquery.ui.core.css" / 

 Content Include="Content\themes\base\jquery.ui.datepicker.css" / 

 Content Include="Content\themes\base\jquery.ui.dialog.css" / 

 Content Include="Content\themes\base\jquery.ui.progressbar.css" / 

 Content Include="Content\themes\base\jquery.ui.resizable.css" / 

 Content Include="Content\themes\base\jquery.ui.selectable.css" / 

 Content Include="Content\themes\base\jquery.ui.slider.css" / 

 Content Include="Content\themes\base\jquery.ui.tabs.css" / 

 Content Include="Content\themes\base\jquery.ui.theme.css" / 

 Content Include="Content\themes\base\minified\images\ui-bg_flat_0_aaaaaa_40x100.png" / 

 Content Include="Content\themes\base\minified\images\ui-bg_flat_75_ffffff_40x100.png" / 

 Content Include="Content\themes\base\minified\images\ui-bg_glass_55_fbf9ee_1x400.png" / 

 Content Include="Content\themes\base\minified\images\ui-bg_glass_65_ffffff_1x400.png" / 

 Content Include="Content\themes\base\minified\images\ui-bg_glass_75_dadada_1x400.png" / 

 Content Include="Content\themes\base\minified\images\ui-bg_glass_75_e6e6e6_1x400.png" / 

 Content Include="Content\themes\base\minified\images\ui-bg_glass_95_fef1ec_1x400.png" / 

 Content Include="Content\themes\base\minified\images\ui-bg_highlight-soft_75_cccccc_1x100.png" / 

 Content Include="Content\themes\base\minified\images\ui-icons_222222_256x240.png" / 

 Content Include="Content\themes\base\minified\images\ui-icons_2e83ff_256x240.png" / 

 Content Include="Content\themes\base\minified\images\ui-icons_454545_256x240.png" / 

 Content Include="Content\themes\base\minified\images\ui-icons_888888_256x240.png" / 

 Content Include="Content\themes\base\minified\images\ui-icons_cd0a0a_256x240.png" / 

 Content Include="Content\themes\base\minified\jquery-ui.min.css" / 

 Content Include="Content\themes\base\minified\jquery.ui.accordion.min.css" / 

 Content Include="Content\themes\base\minified\jquery.ui.autocomplete.min.css" / 

 Content Include="Content\themes\base\minified\jquery.ui.button.min.css" / 

 Content Include="Content\themes\base\minified\jquery.ui.core.min.css" / 

 Content Include="Content\themes\base\minified\jquery.ui.datepicker.min.css" / 

 Content Include="Content\themes\base\minified\jquery.ui.dialog.min.css" / 

 Content Include="Content\themes\base\minified\jquery.ui.progressbar.min.css" / 

 Content Include="Content\themes\base\minified\jquery.ui.resizable.min.css" / 

 Content Include="Content\themes\base\minified\jquery.ui.selectable.min.css" / 

 Content Include="Content\themes\base\minified\jquery.ui.slider.min.css" / 

 Content Include="Content\themes\base\minified\jquery.ui.tabs.min.css" / 

 Content Include="Content\themes\base\minified\jquery.ui.theme.min.css" / 

 Content Include="Global.asax" / 

 Content Include="Content\Site.css" / 

 None Include="Scripts\jquery-1.8.2.intellisense.js" / 

 Content Include="Scripts\jquery-1.8.2.js" / 

 Content Include="Scripts\jquery-1.8.2.min.js" / 

 None Include="Scripts\jquery.validate-vsdoc.js" / 

 Content Include="Scripts\jquery-ui-1.8.24.js" / 

 Content Include="Scripts\jquery-ui-1.8.24.min.js" / 

 Content Include="Scripts\jquery.unobtrusive-ajax.js" / 

 Content Include="Scripts\jquery.unobtrusive-ajax.min.js" / 

 Content Include="Scripts\jquery.validate.js" / 

 Content Include="Scripts\jquery.validate.min.js" / 

 Content Include="Scripts\jquery.validate.unobtrusive.js" / 

 Content Include="Scripts\jquery.validate.unobtrusive.min.js" / 

 Content Include="Scripts\knockout-2.2.0.debug.js" / 

 Content Include="Scripts\knockout-2.2.0.js" / 

 Content Include="Scripts\modernizr-2.6.2.js" / 

 Content Include="Scripts\_references.js" / 

 Content Include="Web.config" / 

 Content Include="Web.Debug.config" 

 DependentUpon Web.config /DependentUpon 

 /Content 

 Content Include="Web.Release.config" 

 DependentUpon Web.config /DependentUpon 

 /Content 

 Content Include="Views\Web.config" / 

 Content Include="Views\_ViewStart.cshtml" / 

 Content Include="Views\Shared\Error.cshtml" / 

 Content Include="Views\Shared\_Layout.cshtml" / 

 /ItemGroup 

 ItemGroup 

 Folder Include="App_Data\" / 

 Folder Include="Controllers\" / 

 Folder Include="Models\" / 

 /ItemGroup 

 ItemGroup 

 Content Include="packages.config" / 

 /ItemGroup 

 PropertyGroup 

 VisualStudioVersion Condition="$(VisualStudioVersion) == " 10.0 /VisualStudioVersion 

 VSToolsPath Condition="$(VSToolsPath) == " $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) /VSToolsPath 

 /PropertyGroup 

 Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" / 

 Import Project="$(VSToolsPath)\WebApplications\Microsoft.WebApplication.targets" Condition="$(VSToolsPath) != " / 

 Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" Condition="false" / 

 Target Name="MvcBuildViews" AfterTargets="AfterBuild" Condition="$(MvcBuildViews)==true" 

 AspNetCompiler VirtualPath="temp" PhysicalPath="$(WebProjectOutputDir)" / 

 /Target 

 ProjectExtensions 

 VisualStudio 

 FlavorProperties GUID="{349c5851-65df-11da-9384-00065b846f21}" 

 WebProjectProperties 

 UseIIS True /UseIIS 

 AutoAssignPort True /AutoAssignPort 

 DevelopmentServerPort 40646 /DevelopmentServerPort 

 DevelopmentServerVPath / /DevelopmentServerVPath 

 IISUrl http://localhost:40646/ /IISUrl 

 NTLMAuthentication False /NTLMAuthentication 

 UseCustomServer False /UseCustomServer 

 CustomServerUrl 

 /CustomServerUrl 

 SaveServerSettingsInUserFile False /SaveServerSettingsInUserFile 

 /WebProjectProperties 

 /FlavorProperties 

 /VisualStudio 

 /ProjectExtensions 

 !-- To modify your build process, add your task inside one of the targets below and uncomment it. 

 Other similar extension points exist, see Microsoft.Common.targets.

 Target Name="BeforeBuild" 

 /Target 

 Target Name="AfterBuild" 

 /Target -- 

 ItemGroup 

 F Include="test.txt" 

 OP tst/ /OP 

 F Include="test1.txt" 

 OP tst/ /OP 

 /ItemGroup 

 Target Name="HW" Inputs="@(F)" Outputs="@(F- %(OP)%(Filename)%(Extension))" 

 Message Text="%(F.OP)"/ 

 Copy SourceFiles="@(F)" DestinationFolder="%(F.OP)" / 

 /Target 

 /Project 

1. Project元素

      作用:根节点,用于配置项目级信息。


  2. ItemGroup/Item元素

ItemGroup 用于对N个Item元素进行分类整理,并可通过Condition属性对旗下的Item元素进行是否生效的统一控制。

Item

作用:对一个或多个文件的命名引用。可包含元数据(如文件名、路径和版本号),元数据均以子元素的形式定义。


示例——定义名为Script的Item

 Script Include="Script/jquery.js;Script/app.js" 

 Version 0.1 /Version 

 /Script 

 Target Name="Nothing" 

 Message Text="@(Script)+%(Script.Version)" / 

 /Target 

// 执行结果:Script/jquery.js;Script/app.js+01

       MSBuild执行引擎中内置部分预定义的Item,具体如下:


None(表示不应在生成过程中具有角色的文件,但同样可输出到生成目录中(默认是不输出到生成目录和不发布)) DependentUpon

*元数据转换(MSBuild Transform)* 

      增量生成就会用到MSBuild Transform。

      作用:将一组Item转换为一组输出值


Inputs="@(BuiltAssemblies)" Outputs="@(BuiltAssemblies - $(OutputPath)%(Filename)%(Extension))" Copy SourceFiles="@(BuiltAssemblies)" DestinationFolder="$(OutputPath)"/ /Target 假定BuiltAssemblies如下 BuiltAssemblies Include="a.txt" /BuiltAssemblies BuiltAssemblies Include="b.txt" /BuiltAssemblies BuiltAssemblies Include="c.txt" /BuiltAssemblies Inputs="@(BuiltAssemblies)" Outputs="@(BuiltAssemblies - $(OutputPath)%(Filename)%(Extension))" 会建立以下的mapping a.txt(时间戳) - bin\a.txt(时间戳) b.txt(时间戳) - bin\b.txt(时间戳) c.txt(时间戳) - bin\c.txt(时间戳) 在执行Target时,会根据Mapping来检查两者的时间戳,若Output的没有时间戳或小于Input的时间戳则该Input项会列入执行的范围,否则则不再被解析执行。

  3. PropertyGroup/Property元素

 PropertyGroup:属性组,用于整理归类Property

 Property:配置信息的键值对


在启动执行引擎时,可从通过/property选项设置,并在脚本中通过$(属性名)的方式来引用 shell MSBuild /property:buildMode=release 脚本文件路径 
在启动执行引擎时,MSBuild预留一些保留属性,供脚本引用 $(MSBuildProjectDirectory) 项目所在的目录
 PropertyName  接收任务输出参数值的属性,后续可通过$(PropertyName)来引用该属性。PropertyName和ItemName存在互斥关系
 ItemName  接收任务输出参数值的项,后续可通过@(ItemName)来引用该项。PropertyName和ItemName存在互斥关系
OutputAssembly="$(builtdir)\$(MSBuildProjectName).dll" Output TaskParameter="OutputAssembly" ItemName="FinalAssemblyName" / Output TaskParameter="BuildSucceeded" PropertyName="BuildWorked" / /Csc /Target

分类:


!-- set security on binaries-- Exec Command="echo y| cacls %(Binaries.Identity) /G everyone:R"/ /Target /Project

继承ITask接口

1. 若要覆盖MSBuild内置任务执行程序则将程序集保存在.NET Framework的目录下,并且后缀必须为.OverrideTasks或.Tasks;

2. 若不覆盖,则通过UsingTask元素的AssemblyFile或AssemblyName属性引入。


Name ParameterType="System.String" Required="True"/
Age ParameterType="System.Integer" Required="True" Output="18"/
/ParameterGroup


          定义内联任务——Task元素详解

          1. 直接在项目文件中编写任务,而不必引用外部包含继承ITask接口的类的程序集

 2. 可用支持.NET CodeDom 语言(例如,Visual Basic、Visual C# 或 JScript)来编写任务逻辑

 子元素:


Class (Code元素包含派生自ITask接口的类代码)

Method (Code元素包含定义ITask接口的Execute方法的重写(方法签名+方法体))

Fragment (Code元素中仅包含Execute方法的方法体代码)


 注意:当UsingTask中出现子元素Task时,则UsingTask的属性TaskFactory必须为 CodeTaskFactory,AssemblyFile 为$(MSBuildToolsPath)\Microsoft.Build.Tasks.v12.0.dll。



 Project ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" 

 UsingTask TaskName="Nothing" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v12.0.dll" 

 ParameterGroup/ 

 Task Type="Fragment" Language="cs" 

 Reference Include="System.Core"/ 

 Using Namespace="System" / 

 Using Namespace="System.IO" / 

 Using Namespace="System.Net" / 

 Using Namespace="Microsoft.Build.Framework" / 

 Using Namespace="Microsoft.Build.Utilities" / 

 Code Type="Fragment" Language="cs" 

 ![CDATA[

 try {

 OutputFilename = Path.GetFullPath(OutputFilename);

 Log.LogMessage("Downloading latest version of NuGet.exe...");

 WebClient webClient = new WebClient();

 webClient.DownloadFile("https://www.nuget.org/nuget.exe", OutputFilename);

 return true;

 catch (Exception ex) {

 Log.LogErrorFromException(ex);

 return false;

 /Code 

 /Task 

 /Project 

  6. Target元素

作用:针对某项工作,有序地组织多个Task。是对外的最小执行单位

属性:


      注意:1.一次生成过程仅会执行同一个Target一次,当出现重复调用时会忽略,且返回第一次调用后的返回值;

2.Target重复定义时,采取最后定义有效的原则

  7. Choose元素

作用:根据条件使部分Property/PropertyGroup/ItemGroup生效

      子元素:


       注意:1. 若当前项目文件没有DefaultTargets属性,则会按引入顺序寻找各被导入的项目文件的DefaultTargets属性,并执行第一个搜索到的DefaultTargets属性值;

    2. 共享的导入项目文件的命名规范是以.targets作为扩展名(如:.nuget/NuGet.targets)

  ImportGroup元素用于组织整理Import元素。

  9. ProjectExtensions元素

作用:内部包含的内容,将不被MSBuild解析执行

 

、特殊字符  

  特殊字符:在MSBuild Script有特殊含义和用途的字符,若将它们作为普通字符输出时,需要通过%xx,xx为字符的ASCII的十六进制值的字面量来表示。


、生成解决方案中的特定目标

      MSBuild.exe SolutionName .sln /t: ProjectName : TargetName ProjectName : TargetName ]* 

 

、小结


本文主要是针对**.csproj中出现的元素来学习MSBuild Script,日后理论*实践后继续补充。