• MSBuild笔记1-介绍


    MSBuild:

    MSBuild不仅仅是一个构造工具,主要涉及到三部分:执行引擎、脚本文件、任务
    执行引擎用来解释脚本文件,执行“构造动作”。MSBuild引擎执行的每一个“构造动作”就是通过任务实现的,任务就是MSBuild的扩展机制,通过编写新的任务就能够不断扩充MSBuild的执行能力。所以这三部分分别代表了引擎、脚本和扩展能力。
    一句话总结MSBuild的作用:利用配置信息对项目文件实施特定顺序的操作。

    在脚本文件中可以做以下操作:

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

    脚本文件四个基本项:

    • 属性(Property):主要用来存储配置信息
    • 项(Item):存储项目文件信息,以及文件的元数据信息
    • 任务(Task):Build过程中的一些原子操作
    • 目标(Target):按特定的顺序将任务组织在一起,并允许在命令行单独指定各个部分

    Project元素:

    这是每一个项目文件的最外层元素,它表示了一个项目的范围。
    Project元素属性:
    DefaultTargets属性:在一个项目的生成过程中可能需要完成几项不同的任务(比如编译、单元测试、check-in到源代码控制服务器中等),其中每一项任务都可以用Target来表示。
    对于拥有多个Target的项目,你可以通过设置Project的DefaultTargets属性来指定需要运行哪(几)个Target,如果没有这个设置,MSBuild将只运行排在最前面的那个Target。

    PropertyGroup元素:

    属性都要包含在PropertyGroup元素内部;
    也可以通过命令行添加全局属性:MSBuild.exe xxx.csproj /p:name=fan
    还有一种属性叫任务发出属性,由Output元素的PropertyName特性指定了属性名,这类属性不像一般的声明式属性那样赋值,而是动态得到的值。是在项目文件中很常见的用法。

    ItemGroup元素:

    Item项都包含在ItemGroup元素中,项大都是用来引入文件用的,而文件会有一些附加信息,比如版本,语言等,而这些附加信息在项目文件中是以项的子元素的出现的,称为项的元数据。元数据是键/值的形式存储的,声明方式和属性相同。
    常用的Item项:
    Reference
    EmbeddedResource:表示要嵌入所生成的程序集中的资源。
    Content:表示未编译到项目中但可能嵌入项目或随其一起发布的文件。
    None:表示在生成过程中不应具有角色的文件。
    ProjectReference:表示对另一个项目的引用。
    NativeReference:
    Compile:表示编译器的源文件。
    COMReference:
    COMFileReference:
    Item详细信息:https://docs.microsoft.com/zh-cn/previous-versions/dotnet/netframework-4.0/bb629388(v=vs.100)

    Item元数据:(除了自定义的一些元数据外,系统还提供一些隐式存在的元数据)

    • %(FullPath) 包含项的完整路径。 例如:C:MyProjectSourceProgram.cs
    • %(RootDir) 包含项的根目录。 例如:C:
    • %(Filename) 包含项的文件名,但不包含扩展名。 例如:Program
    • %(Extension) 包含项的文件扩展名。 例如:.cs
    • %(RelativeDir) 包含 Include 特性中指定的路径,直到最后的反斜杠 ()。 例如:Source
    • %(Directory) 包含项的目录,但不包含根目录。 例如:MyProjectSource
    • %(RecursiveDir) 如果 Include 特性包含通配符 **,则此元数据将指定代替通配符的路径的一部分。
      如果文件夹 C:MySolutionMyProjectSource 包含文件 Program.cs,并且该项目文件包含此项:
    <!--%(MyItem.RecursiveDir) 的值将为 MySolutionMyProjectSource。-->
    <ItemGroup><MyItem Include="C:**Program.cs" /></ItemGroup>
    
    • %(Identity) 在 Include 特性中指定的项。 例如:SourceProgram.cs
    • %(ModifiedTime) 包含上一次修改项的时间戳
    • %(CreatedTime) 包含创建项的时间戳
    • %(AccessedTime) 包含上一次访问项的时间戳

    Target元素

    在Project根元素中使用DefaultTargets特性来指定默认目标,可以包含一个或多个Target
    也可以通过命令行传递参数 MSBuild.exe app1.csproj /target:Build1,Build2

    其他元素

    MSBuild特殊字符:

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

    MSBuild条件

    Condition特性来表示一个布尔表达式,类似于if条件,几乎所有的元素都可以具有Conditon特性

    Import元素

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

    C:WindowsMicrosoft.NETFrameworkv4.0.30319MSBuild.exe app1.csproj

    参考:
    https://www.cnblogs.com/linianhui/archive/2012/08/30/msbuid-introduction-1.html(MSBuild入门)
    https://www.cnblogs.com/linianhui/archive/2012/09/01/msbuid-introduction-2.html(MSBuild入门续)
    https://www.cnblogs.com/shanyou/p/3452938.html(MSBuild简单使用)
    https://docs.microsoft.com/zh-cn/previous-versions/dotnet/netframework-4.0/ms164314(v=vs.100)(MSDN)

  • 相关阅读:
    Webservice接口和Http接口
    java多线程
    时间显示成一串阿拉伯数字
    jsp静态与动态包含的区别和联系
    解决Win10默认占用80端口
    JAVA中文乱码之解决方案
    相对路径与绝对路径的差异
    JSP静态包含和动态包含的区别和联系
    数据库Oracle
    智能指针shared_ptr的用法
  • 原文地址:https://www.cnblogs.com/fanfan-90/p/13831610.html
Copyright © 2020-2023  润新知