日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

MSBuild学习总结

發布時間:2025/4/14 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MSBuild学习总结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

MSBuild的簡單介紹與使用

http://www.cnblogs.com/shanyou/p/3452938.html


MSBuild 是 Microsoft 和 Visual Studio的生成系統。它不僅僅是一個構造工具,應該稱之為擁有相當強大擴展能力的自動化平臺。MSBuild平臺的主要涉及到三部分:執行引擎、構造工程、任務。其中最核心的就是執行引擎,它包括定義構造工程的規范,解釋構造工程,執行“構造動作”;構造工程是用來描述構造任務的,大多數情況下我們使用MSBuild就是遵循規范,編寫一個構造工程;MSBuild引擎執行的每一個“構造動作”就是通過任務實現的,任務就是MSBuild的擴展機制,通過編寫新的任務就能夠不斷擴充MSBuild的執行能力。所以這三部分分別代表了引擎、腳本和擴展能力。


構造工程(腳本文件)?
先說說構造工程,只要通過Notepad打開任何一個Visual Studio下的C#工程(csproj)文件,就知道構造工程到底是怎么回事了。


<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
? <PropertyGroup>
? ? <Root>$(MSBuildStartupDirectory)</Root>
? </PropertyGroup>
? <Target Name="Build">
? ? <!-- Compile -->
? ? <ItemGroup>?
? ? ? <ProjectToBuild Include="$(Root)\..\src\Foundation\Common\Gimela.Common.sln" />
? ? ? <ProjectToBuild Include="$(Root)\..\src\Foundation\Infrastructure\Gimela.Infrastructure.sln" />
? ? ? <ProjectToBuild Include="$(Root)\..\src\Foundation\Management\Gimela.Management.sln" />
? ? ? <ProjectToBuild Include="$(Root)\..\src\Foundation\Security\Gimela.Security.sln" />
? ? ? <ProjectToBuild Include="$(Root)\..\src\Foundation\Tasks\Gimela.Tasks.sln" />
? ? ? <ProjectToBuild Include="$(Root)\..\src\Foundation\Text\Gimela.Text.sln" />
? ? ? <ProjectToBuild Include="$(Root)\..\src\Foundation\Net\Gimela.Net.sln" />
? ? ? <ProjectToBuild Include="$(Root)\..\src\Foundation\ServiceModel\Gimela.ServiceModel.sln" />
? ? ? <ProjectToBuild Include="$(Root)\..\src\Foundation\Data\Gimela.Data.sln" />
? ? ? <ProjectToBuild Include="$(Root)\..\src\Foundation\Presentation\Gimela.Presentation.sln" />
? ? ? <ProjectToBuild Include="$(Root)\..\src\Foundation\Media\Gimela.Media.sln" />
? ? ? <ProjectToBuild Include="$(Root)\..\src\Foundation\Streaming\Gimela.Streaming.sln" /> ??
? ? ? <ProjectToBuild Include="$(Root)\..\src\Crust\Gimela.Crust.sln" /> ? ? ?
? ? </ItemGroup>
? ? <MSBuild Projects="@(ProjectToBuild)" Targets="Build" Properties="Configuration=Debug;">
? ? ? <Output TaskParameter="TargetOutputs" ItemName="AssembliesBuiltByChildProjects" />
? ? </MSBuild>
? ??
? </Target>
</Project>
在構造工程中我們可以定義和使用變量(通過Property/PropertyGourp/Item/ItemGroup等元素),可以使用條件分支(通過Choose/When/Otherwise等元素)、能夠在運行時給變量賦值(通過執行任務,獲取其返回類型參數的方式)、能夠定義執行塊(通過Target元素,相當于函數)、能夠進行異常處理(通過OnError元素)、還可以復用已有工程定義的內容(通過Import元素)。擁有這些能力和高級語言已經相差無幾了,所以筆者認為構造工程不是描述性語言,而是腳本語言。


這里還需要強調一點的是,項目級元素(Property)可以在元素下定義,也可以在構造過程中作為外部參數傳入,這是一個非常有用的特性,一般編譯時選擇配置項(Debug或者Release)就是利用這個特性實現的。


Project元素?
這是每一個項目文件的最外層元素,它表示了一個項目的范圍。如果缺少了這一元素,MSBuild會報錯稱Target元素無法識別或不被支持。?
Project元素擁有多個屬性,其中最常用到的是DefaultTargets屬性。我們都知道,在一個項目的生成過程中可能需要完成幾項不同的任務(比如編譯、單元測試、check-in到源代碼控制服務器中等),其中每一項任務都可以用Target來表示。對于擁有多個Target的項目,你可以通過設置Project的DefaultTargets(注意是復數)屬性來指定需要運行哪(幾)個Target,如果沒有這個設置,MSBuild將只運行排在最前面的那個Target。


Property元素


在項目中你肯定需要經常訪問一些信息,例如需要創建的路徑名、最終生成的程序集名稱等。以name/value的形式添加進Property,隨后就可以以$(PropertyName)的形式訪問。這樣你就無須為了改動一個文件名稱而讓整個項目文件傷筋動骨了。比如上面代碼中的Bin就是將要創建的路徑名稱,而AssemblyName則是最終要生成的程序集名稱。這些屬性的名稱不是固定的,你完全可以按自己的習慣來進行命名。在使用時,你需要把屬性名稱放在”$(“和”)”對內(不包括引號),以表示這里將被替換成一個Property元素的值。?
另外,如果Property元素數量比較多,你還可以把它們分門別類地放在不同的PropertyGroup里,以提高代碼的可閱讀性。這對Property本身沒有任何影響。


?<PropertyGroup>
? ? <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
? ? <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
? ? <ProductVersion>8.0.30703</ProductVersion>
? ? <SchemaVersion>2.0</SchemaVersion>
? ? <ProjectGuid>{6C2561FB-4405-408F-B41B-ACE5E519A26E}</ProjectGuid>
? ? <OutputType>Library</OutputType>
? ? <AppDesignerFolder>Properties</AppDesignerFolder>
? ? <RootNamespace>Gimela.Infrastructure.Patterns</RootNamespace>
? ? <AssemblyName>Gimela.Infrastructure.Patterns</AssemblyName>
? ? <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
? ? <FileAlignment>512</FileAlignment>
? </PropertyGroup>
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里。


? <ItemGroup>
? ? <Reference Include="System" />
? ? <Reference Include="System.Core" />
? ? <Reference Include="System.Data" />
? ? <Reference Include="System.ServiceModel" />
? ? <Reference Include="System.Xml" />
? </ItemGroup>
? <ItemGroup>
? ? <Compile Include="Commands\CommandBase.cs" />
? ? <Compile Include="Commands\DuplexCommandBase.cs" />
? ? <Compile Include="Commands\ICommand.cs" />
? ? <Compile Include="Commands\IDuplexCommand.cs" />
? ? <Compile Include="Extensions\BitConverterExtensions.cs" />
? ? <Compile Include="Extensions\ConcurrentDictionaryExtensions.cs" />
? ? <Compile Include="Extensions\StopwatchExtensions.cs" />
? ? <Compile Include="Extensions\TimeSpanExtensions.cs" />
? ? <Compile Include="Flyweight\FlyweightObjectPool.cs" />
? ? <Compile Include="Singleton\StaticSingleton.cs" />
? ? <Compile Include="Properties\AssemblyInfo.cs" />
? ? <Compile Include="SmartQueue\ISmartQueueMapper.cs" />
? ? <Compile Include="SmartQueue\SmartQueue.cs" />
? ? <Compile Include="SmartQueue\SmartQueueBase.cs" />
? ? <Compile Include="SmartQueue\SmartQueueMapper.cs" />
? ? <Compile Include="UnitOfWork\IUnitOfWork.cs" />
? ? <Compile Include="UnitOfWork\IUnitOfWorkFactory.cs" />
? ? <Compile Include="UnitOfWork\UnitOfWork.cs" />
? ? <Compile Include="WeakActions\IWeakActionExecuteWithObject.cs" />
? ? <Compile Include="WeakActions\WeakAction.cs" />
? ? <Compile Include="WeakActions\WeakActionGeneric.cs" />
? ? <Compile Include="WeakFuncs\IWeakFuncExecuteWithObjectAndResult.cs" />
? ? <Compile Include="WeakFuncs\WeakFunc.cs" />
? ? <Compile Include="WeakFuncs\WeakFuncGeneric.cs" />
? </ItemGroup>
Target元素?
Target表示一個需要完成的虛擬的任務單元。每個Project可以包括一個或多個Target,從而完成一系列定制的任務。你需要給每個Target設置一個Name屬性(同一Project下的兩個Target不能擁有同樣的Name)以便引用和區別。


舉例來說,在你的項目生成過程中可能需要完成三個階段的任務:首先check-out源代碼,接下來編譯這些代碼并執行單元測試,最后把它們check-in。那么通常情況下你可以創建三個不同的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,在上文中沒有)會被執行。


Task元素?
這可能是整個項目文件中最重要的,因為它才是真正可執行的部分(這也是為什么我在上面說Target是虛擬的)。你可以在Target下面放置多個Task來順序地執行相應的任務。


相關文檔


MSBuild入門
MSBuild入門(續)
Introduction to MSBuild - Part 1
Working with MSBuild - Part 2
========

MSBuild入門

http://www.cnblogs.com/l_nh/archive/2012/08/30/2662648.html
MSBuild是什么?


MSBuild全稱(Microsoft Build Engine),是用于構建應用程序的平臺。您可能不知道它,但是如果您在使用VS做開發,那么一定時時刻刻在使用它。因為是它在背后為你管理生成你的項目文件。當新建一個項目時,注意下項目文件夾中的*.*proj文件就是為MSBuild提供的,這是個文本文件,基于XML格式,里面包含有項目所包含的文件,生成配置,輸出配置等信息。當把一個文件或者圖片等添加到項目中,就會在這里添加一個描述,反之則刪除一個描述信息;在項目屬性頁所做的配置也會在這里存儲。


為何去了解MSBuild


想去了解這個源于以前學WPF時的疑惑(當時就想從MSBuild下手了,一直沒精力,拖到現在),因為不知道XAML為何就跑到生成的程序集,以及這個XAML標記最后變成什么,WPF是如何處理這些XAML標簽與C#代碼的?一般寫代碼時我都會清楚的知道這個代碼最后經由編譯器變成了什么,這樣心里比較底。但是這個XAML,是看不透,看不透就心里堵得慌,不踏實,我比較喜歡刨根問底,所以就想到通過這個入口探個究竟。


我想從MSBuild中得到什么


第一解決我上面說疑惑;
第二理解項目中這些文件是如何組織在一起并生成最終程序的(就像在WPF上Build是生成出來exe,而WP7則是出來一個XAP包,為何?);
第三了解到為止,以看懂理解為目的,不做深入研究。
MSBuild基本概念


MSBuild有四個基本塊(屬性、項、任務、目標):


MSBuild屬性: ? 屬性是一些鍵/值對,主要用來存儲一些配置信息。
MSBuild ? 項: ? 主要是存儲一些項目文件信息,以及文件的元數據信息(如版本號)。
MSBuild任務: ? Build過程中的一些原子操作(如CSC、MakeDir)
MSBuild目標: ? 按特定的順序將任務組織在一起,并允許在命令行單獨指定各個部分。
一句話總結MSBuild的作用:利用配置信息對項目文件實施特定順序的操作。


MSBuild屬性


屬性聲明方式:


復制代碼
?1 <?xml version="1.0" encoding="utf-8"?>
?2 <!--根元素,表示一個項目-->
?3 <!--DefaultTargets用于定默認執行的目標-->
?4 <Project DefaultTargets="build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
?5 ? <!--屬性都要包含在PropertyGroup元素內部-->
?6 ? <PropertyGroup>
?7 ? ? <!--聲明一個"linianhui"屬性,其值為"hello world"-->
?8 ? ? <linianhui>hello world</linianhui>
?9 ? </PropertyGroup>
10 ? <!--目標-->
11 ? <Target Name="build">
12 ? ? <!--MSBuild提供的一個內置任務,用于生成記錄信息用$(屬性名)來引用屬性的值-->
13 ? ? <Message Text="$(linianhui)"></Message>
14 ? </Target>
15 </Project>
復制代碼
保存此文件到d:\helloworld.xml文件。打開CMD窗口,輸入MSBuild helloworld.xml:


MSBuild helloworld.xml
打印出“linianhui”屬性的值。MSBuild提供一些保留屬性,可以方便的引用$,如$(MSBuildProjectFile)將返回項目文件的完整名(helloworld.xml)。其他的保留屬性可以查閱MSDN幫助文檔。


MSBuild項


?項聲明方式:


復制代碼
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
? <!--項都要包含在ItemGroup元素內部-->
? <ItemGroup>
? ? <!--聲明一個"CSFile"的項,Include表示引入"csfile1.cs"文件-->
? ? <CSFile Include="csfile1.cs">
? ? ? <!--Version表示項的元數據(附加信息)-->
? ? ? <Version>1.0.0.0</Version>
? ? </CSFile>
? ? <!--也可用";"一次引入多個文件-->
? ? <CSFile Include="csfile2.cs;csfile3.cs"/>
? </ItemGroup>
? <Target Name="build">
? ? <!--@引用項的值,默認以";"分割開-->
? ? <!--輸出"csfile1.cs;csfile2.cs;csfile3.cs"-->
? ? <Message Text="@(CSFile)"></Message>
? ? <!--可以加第二個參數替換默認的";"分隔符-->
? ? <!--輸出"csfile1.cs+csfile2.cs+csfile3.cs"-->
? ? <Message Text="@(CSFile,'+')"></Message>
? ? <!--%引用項的元數據,輸出"1.0.0.0"-->
? ? <Message Text="%(CSFile.Version)"></Message>
? </Target>
</Project>
復制代碼
MSBuild任務


上述Msaage就是一個任務,用于打印信息,常用的一些還包括CSC、MakeDir、Copy等等,大多任務都是有輸出信息的,這些信息可以通過OutPut元素存儲在屬性或者項中。先寫如下CS代碼:


復制代碼
1 //存為d:\MSBuildDemo.cs
2 public class MSBuildDemo
3 {
4 ? ? static void Main()
5 ? ? {
6 ? ? ? ? System.Console.WriteLine("MSBuild組織編譯");
7 ? ? }
8 }
復制代碼
然后更改項目文件如下:


復制代碼
?1 <?xml version="1.0" encoding="utf-8"?>
?2 <Project DefaultTargets="build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
?3 ? <ItemGroup>
?4 ? ? <!--指定要編譯的文件-->
?5 ? ? <CSFile Include="MSBuildDemo.cs"/>
?6 ? </ItemGroup>
?7 ? <Target Name="build">
?8 ? ? <!--使用Csc任務,對應csc編譯器-->
?9 ? ? <!--Sources屬性表示要編譯的文件集合-->
10 ? ? <!--TargetType表示編譯目標類型,對應csc編譯器的/target參數-->
11 ? ? <Csc Sources="@(CSFile)"
12 ? ? ? ? ?TargetType="exe">
13 ? ? ? <!--OutputAssembly為csc的輸出參數-->
14 ? ? ? <!--PropertyName表示把TaskParameter屬性所指定的輸出參數的值存儲到outputExeName這個屬性中-->
15 ? ? ? <!--Output還有一個ItemName屬性,表示存儲到一個項中-->
16 ? ? ? <Output TaskParameter="OutputAssembly" PropertyName="outputExeFileName"/>
17 ? ? </Csc>
18 ? ? <!--Message任務就可以使用csc所導出的屬性outputExeFileName了-->
19 ? ? <!--輸出MSBuildDemo.exe-->
20 ? ? <Message Text="$(outputExeFileName)"/>
21 ? ? <!--Exec任務可以運行帶有指定程序(可加參數)或命令-->
22 ? ? <!--運行剛從MSBuildDemo.cs源文件編譯好的程序-->
23 ? ? <!--運行結果為"MSBuild組織編譯"-->
24 ? ? <Exec Command="$(outputExeFileName)"></Exec>
25 ? </Target>
26 </Project>
復制代碼
用MSbuild執行此項目文件,如期正確打印信息。


MSBuild目標


上面的一個例子中Target元素就是MSBuild目標,此目標按照編譯源代碼、打印編譯好的程序文件名、執行該文件這個順序組織了這三個任務。這就是目標所要做的事情。先簡單介紹到這里吧,關于(屬性、項、任務、目標)的一些擴展信息會在下一篇介紹。如有錯誤之處,歡迎指正!


注:以上資料全部來自MSDN幫助文檔。
========

總結

以上是生活随笔為你收集整理的MSBuild学习总结的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产a国产片 | jizzjizz美国| 免费黄色国产 | 手机在线观看毛片 | 日产精品久久久久久久蜜臀 | 久久av网站| 欧美草逼视频 | 国产精品日韩专区 | 91麻豆精品国产91 | 一级黄色性生活片 | 中国黄色片子 | av片在线观看 | 亚洲黄一区 | 免费无码肉片在线观看 | 欧美视频一区在线观看 | 在线观看黄色av网站 | 欧美夫妻性生活视频 | 99日韩| 久久人妻精品白浆国产 | 亚色中文字幕 | 色啪视频 | 日韩污污| 极品三级 | 香蕉av网 | 精品少妇无码av无码专区 | 国产美女久久 | 欧美高清大白屁股ass18 | 91avcom| 三级性生活片 | 国产一区二区三区四区五区六区 | 污片视频在线观看 | 污视频在线观看网址 | 毛片毛片毛片毛片毛片毛片毛片毛片毛片毛片 | 老王66福利网 | 成人网站在线进入爽爽爽 | 色女人天堂 | 成全影视在线观看第8季 | 丰满人妻一区二区三区53 | 爱情岛亚洲品质自拍极速福利网站 | 91免费看片网站 | 男人的天堂视频 | 少妇精品视频一区二区 | jul023被夫上司连续侵犯 | 夜夜噜噜噜| 日韩黄色大全 | 国内精品在线观看视频 | 男男肉耽高h彩漫 | 久久精彩视频 | 男女在线观看视频 | 一区二区日韩电影 | 尤物视频网站在线观看 | 色综合999 | 色漫在线观看 | 久福利 | 久久天堂av综合合色蜜桃网 | 精品国产成人av | 国产成人区 | 狠狠干2020 | 国产综合久久 | 精品视频一区二区在线观看 | 女人扒开腿让男人捅爽 | 夜夜摸夜夜爽 | 亚洲精品国产精品乱码不66 | 国产传媒国产传媒 | 久久国产三级 | 筱田优全部av免费观看 | 精彩视频一区二区三区 | 日本少妇高潮喷水xxxxxxx | 78m78成人免费网站 | av国产网站 | 亚洲在线观看免费 | 亚洲精品一区二区三区婷婷月 | 芒果视频在线观看免费 | 天堂在线www | 国偷自产av一区二区三区麻豆 | 中文字幕欧美人妻精品 | 色人人 | 国产国产乱老熟女视频网站97 | 亚洲高清欧美 | 中国黄色一级视频 | 成人观看网站 | 四虎影裤| 狠狠做深爱婷婷久久综合一区 | 国产日韩一级片 | 欧美中文字幕一区二区 | 欧美成人精品一区二区男人看 | 色综合久久av | 伊人365| 澳门黄色网 | 九九热精品视频在线 | 韩日av一区二区 | 伊人天堂在线 | 久久精品无码一区 | 久久久久久久久久免费视频 | av5566| 久久人人爽爽 | 免费美女毛片 | 国内外成人免费视频 | 国产亚洲欧美视频 |