MSBuild编译扩展
新增一個C#工程,用記事本打開工程文件(.csproj結尾),滾動條拉到最后,大家可以看到一段如下的代碼,其中<Target Name="BeforeBuild">和<Target Name="AfterBuild">大家根據名字也就可以看出,在編譯前后似乎可以做些什么,不著急慢慢來。
<Project>......<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /><!-- 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>--> </Project>
?首先了解下MSBuild 項目文件架構引用,這里介紹了這些煩人的XML節點的定義。
http://msdn.microsoft.com/zh-cn/library/5dy88c2e.aspx
另外一些MS封裝好的任務我們也瀏覽下
http://msdn.microsoft.com/zh-cn/library/7z253716.aspx
這里的任務我們就可以直接在? <Target></Target>中使用了,例如我們想在編譯后執行一個拷貝任務,就可以這樣寫:
<Project>......<ItemGroup><CopySourceFiles Include="copyTest.txt" /></ItemGroup><ItemGroup /><PropertyGroup><TargetFolder>bin\Debug</TargetFolder></PropertyGroup><Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /><!-- 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"><Copy SourceFiles="@(CopySourceFiles)" DestinationFolder="$(TargetFolder)" SkipUnchangedFiles="true" /></Target> </Project> 這樣幾句簡單的語句就可以在我們每次編譯的時候將copyTest.txt拷貝到指定的bin\Debug文件夾下了,當然你也可以說,直接將文件添加的工程,將文件的編譯屬性改成總是拷貝不就可以 嗎,何必這么麻煩,是的這樣對于簡單的拷貝操作的確不需要這么操作,這里是為了簡單介紹下編譯任務,何況上面連接地址那么多任務不是簡單設置下文件屬性就是可以實現的。
以上任務可以通過各種組合實現更加復雜的任務,可見MSBuild沒想象的那么單純,它不僅是簡簡單單的只能執行編譯操作,他也可以是一個強大的任務引擎。這里有一篇文章比較詳細介紹MSBuild:http://blog.csdn.net/mittermeyer/article/details/3839101
???? 不僅如此,我們還可以自定義任務,新建一個類庫工程,添加引用Microsoft.Build開頭的那些庫,自定義的任務就得繼承任務接口ITask接口
public interface ITask { IBuildEngine BuildEngine { get; set; } ITaskHost HostObject { get; set; } bool Execute(); }當然這個接口看起來實現有些復雜,為了實現一個簡單的任務我們可以從實現ITask類的抽象類Task繼承,這樣我們只需要重寫Execute方法即可,以下我們實現一個創建文件夾的目錄的任務,首先我們先定義一個目錄屬性OutPutDir 上面特性[Required]表示這個屬性是必須輸入的。這樣一個簡單的MSBuild擴展任務就完成了。
public class DoTask : Task{private string _OutPutDir;[Required]public string OutPutDir{get { return _OutPutDir; }set { _OutPutDir = value; }}public override bool Execute(){ if(!Directory.Exists(_OutPutDir)){Directory.CreateDirectory(_OutPutDir);}return true;}}下面看下我們如何調用我們生產的這個任務吧,把生成的dll文件放到我們測試工程下,用記事本打開工程文件在文件最后添加以下節點:
<Project>......<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /><!-- 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>--><UsingTask TaskName="DoTask" AssemblyFile="MSTaskExtensionTest.dll"/><Target Name="AfterBuild"><DoTask OutPutDir="$(MSBuildProjectDirectory)\HelloWorld"/></Target> </Project>使用UsingTask對我們的任務進行引用,其中TaskName為我們定義的任務名稱,AssemblyFile為我們任務編譯后的dll文件地址,
其中有一句$(MSBuildProjectDirectory),這個是對當前工程文件目錄的引用,更多引用:
MSBuildProjectDirectory : 項目文件所在目錄的絕對路徑,例如,C:/MyCompany/MyProduct。
MSBuildProjectFile?????????? : 項目文件的完整文件名(包括文件擴展名),例如,MyApp.proj。
MSBuildProjectExtension : 項目文件的文件擴展名(包括點號),例如,.proj。
MSBuildProjectFullPath?? : 項目文件的絕對路徑和完整文件名,例如,C:/MyCompany/MyProduct/MyApp.proj。
MSBuildProjectName?????? : 項目文件的文件名(不包括文件擴展名),例如,MyApp。
MSBuildBinPath?????????????? : 當前使用的 MSBuild 二進制文件所在目錄的絕對路徑。
MSBuildProjectDefaultTargets : Project元素的 DefaultTargets 屬性中指定的目標的完整列表。
MSBuildExtensionsPath? : MSBuild 文件夾位于 Program Files 目錄下。此位置用于存放自定義目標文件。
參考:http://blog.csdn.net/livelylittlefish/article/details/3410733
最后查看我們任務運行后截圖吧:
HelloWorld就是我們編譯后使用自定義任務生成的文件夾?,F在我們可以隨心所欲進行更復雜的任務了...
?
?
?
轉載于:https://www.cnblogs.com/guanglin/p/3161216.html
總結
以上是生活随笔為你收集整理的MSBuild编译扩展的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php 数据类型转换与比较
- 下一篇: String Statistics(20