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元素中.
任务:
根据条件表述停止执行目标并将将记录写入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>
- MSBuild简述
- MsBuild
- MSBuild
- msbuild
- MSBuild入门
- MSBUILD全过程
- 学习MSBuild
- MSBuild入门
- MSBuild入门
- MSBuild基本概念
- MSBuild 概述
- MSBuild 简解
- MSBuild 属性
- MSBuild入门
- MSBuild 简解
- msbuild introduction
- msbuild入门教程
- MSBuild入门
- BlackBerry 9850 应用:旅行管家 BlackBerry Travel,RIM公司免费提供
- 安装jdk
- 用户表空间限额(Oracle User Space Quota )
- CentOS6.2下编译安装freerdp tar包
- 开博题记
- MSBuild简述
- ps对图层旋转180
- mysql 授权表tables_priv
- 求坐标转换矩阵
- Mysql 入门学习指南
- 推荐系统之详细介绍
- Xcode代码行数统计
- SpringRoo中action 和 方法的映射关系
- 根文件系统的制作