MSBuild简述

来源:互联网 发布:panc.cc搜索软件 编辑:程序博客网 时间:2024/06/06 03:46

(声明:本文是从MSDN翻译过来,有些地方不专业,请不要随意引用;有发现错误的,可指正。)

MSBuild概述
MSBuild 引擎室为微软和Visual Studio专有的新的构建平台。MSBuild对于在构建软件时其内部处理机制完全透明,用户可以在没有安装Visual Studio的情况下,利用建构实验室环境(BLE)
精心设计和构建自己的软件产品。
MSBuild引进了一种很简单、易于扩展,完全为MS所支持、本质还是XML的工程文件(*.csproj,*proj),这种工程文件可以让开发人员完整地描述他需要构建那些项(Items
),以及他怎么样在不同的平台和配置构建。

另外,开发者可以自定义可复用的构建规则,并在不同的文件中使用这些规则,以使构建过程在产品的各个项目中保持连贯性、一致性。
MSBuild 工程文件中几个经常的出现的元素是:Items,Tasks,Peroperties.
你可以使用MSBuild.exe,在命令行输入工程文件名,以及一些额外的参数、选项。命令行选项允许你设置属性的值、执行指定的目标(Target)、指定的日志记录。 例如下面的例子:
MSBuild.exe MyProj.proj /property:Configuration=Debug

 

--------------------MSBuild  属性---------------------
属性以Key/Value的格式存在,用于配置工程的构建。属性可以有效地将值传递给任务,并且在整个工程文件中保存任何值。

1.定义、访问属性
属性可以由以下形式定义:

<PropertyGroup>    <yourPropertyName>Value</yourPropertyName></PropertyGroup>



定义好属性后你可有这样访问属性:$(yourPropertyName)

2.从命令行设置属性
  msbuild.exe myproj.csproj /p:yourPropertyName=yourValue
这样设置后,原先在工程文件里设置好的值就被覆盖了,其中/p也可以用/property

3.保留属性
  msbuild 保留了一些属性的名称,用于保存一些有关工程文件的信息和MsBuild二进制信息。保留属性的访问方式和普通属性一样,使用$()符号。

4.环境变量
你可以在工程文件里像访问保留属性那样,访问系统环境变量。例如:<FinalOUput>$(BIN_PATH)\MyAssembly.dll</FinalOUput>.  如果环境变量还没有赋值,那么你可以设置,用节点的
Condition属性判断环境变量是否设置,例如<FinalOUput Condition="'$(TOOLSPATH)'==''">c:\tools</FinalOUput>。如果环境变量命名有冲突,那么原环境变量将被覆盖。

5.注册表属性
你可以用一下语法访问系统注册表值:
$(registry:Hive\MyKey\MySubKey@Value)
欲获得默认的子键(SubKey)值,可省略"@Value".
注册表值可以用于初始化工程属性,例如为了呈现Visual Studio网络浏览器主页,我们可以这样编写代码:

<PropertyGroup><VisualStudioWebBrowserHomePage>$(registry:HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\9.0\WebBrowser@HomePage)</VisualStudioWebBrowserHomePage><PropertyGroup>


6.在Properties中保存XML数据
例如下面这段代码:

<PropertyGroup>    <ConfigTemplate>        <Configuration>            <Startup>                <SupportedRuntime                    ImageVersion="$(MySupportedVersion)"                     Version="$(MySupportedVersion)"/>                <RequiredRuntime                    ImageVersion="$(MyRequiredVersion)                    Version="$(MyRequiredVersion)"                     SafeMode="$(MySafeMode)"/>            </Startup>        </Configuration>    </ConfigTemplate></PropertyGroup>


属性ConfigTemplate定义了一个根名为Configuration的XML数据.

 

---------------------MSBuild 目标---------------------------

目标元素以一定的顺序包含一些任务(Tasks),并且使得一些处理程序可以从Command Line被Called.顾及工程文件的扩展和增加其可读性,目标元素常常被包含在一些逻辑块中.例如:目标A可能用于删除输出文件夹中所有文件以为工程构建做铺垫,而另一个目标B会为工程编译输入的代码并且将其放在这个被清空的文件夹中。

1.在工程文件中声明目标
用Target标签声明目标,例如:

<Target Name="Compile>    <Csc Sources="@(Compile)" /></Target>


目标被执行前还可以判断一些条件以确定次目标是否被执行,Condition作为节点属性使用。
条件语法有一下几种:
'stringA'=='stringB'----------------------------------------这两个字符串是否相等
'stringA'!='stringB'-----------------------------------------这两个字符串是否有差别
<,>,<=,>=-----------------------------------------------------数值逻辑比较
Exists('stringA')---------------------------------------------这个用于判断文件或者文件夹是否存在
HasTrailingSlash('stringA')------------------------------判断字符串中是否存在反斜杠(\)或顺斜杠(/)
!-----------------------------------------------------------------二进制逻辑反相
And-------------------------------------------------------------二进制逻辑与
Or---------------------------------------------------------------二进制逻辑或
()----------------------------------------------------------------表达式判断

2.依赖分析
在许多高级的场合下,目标在彼此之间存在一定的先后执行的顺序。你可以让一个Target在另一个Target之前执行,这时候你需要使用到节点属性DependsOnTargets。这样在目标被执行的时
候,MSBuild引擎将自动地首先执行这些带有DenpensOnTargets属性的Targets.
》》》》》递增构建工程《《《《《
为目标元素添加属性Inputs和Outputs后,MSBuild引擎就会判断当前目标是否需要执行(可能之前执行过),例如下面这个例子:

<Target Name="Build"     Inputs="@(CSFile)"     Outputs="hello.exe">    <Csc        Sources="@(CSFile)"         OutputAssembly="hello.exe"/></Target>

 

MSBuild在运行的时候,会比较@(CSFile)中的文件和hello.exe文件的时间标签,如果前者时间靠后,MSBuild就会运行它,否则跳过。

 

----------------------------任务(Target)-----------------------------
一个构建平台在构建期间需要具备执行一定数量的动作的能力。MSBuild使用tasks来实现这一目的。一个任务是一个可执行代码单元,MSBuild以此实现一些原子构建操作。
 1.任务逻辑
 工程文件(*.proj  *csproj)不可能完整地、独立地执行所有的构建作业,所以task Logic必须在其外面实现。task logic实现了Microsoft.Build.Framework名称空间下的ITask接口。
task类定义了input和output参数,这两个参数可以在工程文件里使用。所有非静态、非抽象的属性都可以在工程文件里的target元素下使用。

2.在工程文件里执行任务
在执行任务之间,你需要在工程文件里映射你使用任务所需要的组件,你可以使用UsingTask标签引入你需要的任何外部组件,这样MSBuild才能找得到执行的逻辑。
为了执行任务,在工程文件里的Target标签下添加一个task节点,名称必须使用已经定义的taks的名称,如果任务需要接受参数,你可以以属性的形式传入这些参数。
例如下面的例子:

<Target Name="MakeBuildDirectory">    <MakeDir        Directories="$(BuildDir)" /></Target>


上面的例子中,使用属性BuildDir的值作为创建目录来创建一个新的目录。

<Target Name="CopyFiles">    <Copy        SourceFiles="@(MySourceFiles)"        DestinationFolder="@(MyDestFolder)">        <Output            TaskParameter="CopiedFiles"            ItemName="SuccessfullyCopiedFiles"/>     </Copy></Target>


上面的例子说明,任务还可以向工程文件中返回一些信息,这些信息可以被存放在属性和item里.上面的操作内容是:执行Copy任务,并且将输出属性Copiedfiles保存到SuccessfullyCopiedFiles Item元素中.

任务:

TaskAL (Assembly Linker) 描述任务本身和其参数AspNetCompiler 用于预编译ASP.NET应用的工具AssignCulture 将特定的文化配置到Item中CallTarget唤醒工程文件中的目标Copy复制CreateItem创建一个Item元素CreateProperty创建一个属性元素Csc编译*.cs文件Delete删除MakeDir创建目录Error
根据条件表述停止执行目标并将将记录写入log文件Exec根据闯入的参数运行指定的程序或命令FindUnderPath确定指定文件是否存在于指定的目录下或其子目录下

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 以及其他更多Task:

GenerateApplicationManifest、GenerateBootstrapper、GenerateDeploymentManifest、GenerateResource、GetAssemblyIdentity
、GetFrameworkPath、GetFrameworkSdkPath、LC、Message、MSBuild、ReadLinesFromFile、RegisterAssembly、RemoveDir
ResGen、ResolveAssemblyReference、ResolveComReference、ResolveKeySource、ResolveNativeReference、SGen、SignFile、Touch、UnregisterAssembly、Vbc、VCBuild、Warning、WriteLinesToFile.


-------------------项(Item)-----------------------
items向构建系统提供了一些输入参数,它被包含在元素集合itemGroup元素下,这些item集合可以用来输入任务。
1.在工程文件里创建Items
 如下例:

<ItemGroup>    <Compile Include = "file1.cs"/>    <Compile Include = "file2.cs"/></ItemGroup>


 也可以这样写:

<ItemGroup>    <Compile Include = "file1.cs;file2.cs"/></ItemGroup>


 2.在工程文件里访问Items
 可以使用语法@(ItemCollectionName),例如上例中可以使用@(Compile)


3.使用通配符指定具体的Items
 你可以使用 **, *, 和?通配符来指定一批文件作为输入参数,而不必要一个一个地指定。
 ?匹配一个字符
 *匹配零个或多个字符,例如:<CSFile Include="*.cs"/>
 **匹配完整路径的一部分,例如:<VBFile Include="D:/**/*.vb"/>.


4.使用Exclude(排除)属性

<ItemGroup>    <CSFile        Include="*.cs"        Exclude="DoNotBuild.cs"/> </ItemGroup>


 5.Item元数据(MetaData)
 你可以在Item元素下添加一个或多个元素作为其元数据:

<ItemGroup>    <CSFile Include="main.cs">        <Culture>Fr</Culture>    </CSFile></ItemGroup>


 6.工程文件中访问元数据
 使用语法%(ItemMetaDataName),如果这样表述存在名称冲突,则可以这样写:%(ItemCollectionName.ItemMetaDataName),下面的例子使用名称为Display的元数据来执行批处理操作

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">    <ItemGroup>        <Stuff Include="One.cs" >            <Display>false</Display>        </Stuff>        <Stuff Include="Two.cs">            <Display>true</Display>        </Stuff>    </ItemGroup>    <Target Name="Batching">        <Message Text="@(Stuff)" Condition=" '%(Display)' == 'true' "/>    </Target></Project>