在.Net framework中,一個不太被大家熟知的工具就是MSBuild。這個命令行工具通過執行XML腳本可以自動生成軟件工程文件。
但問題來了,“我為什么想要我的生成過程自動化?”。 其實,大部分普通的的項目都有可能包含一系列的生成過程,例如:
- · 增加版本號
- · 編譯源代碼
- · 針對不同的部署環境選擇正確的設置(例如,測試或者現場)
- · 在安裝包中引入第三方的依賴
像這些工作,如果手動生成我們想要的一定是一個會非常耗時,容易出錯的過程。並且我們一開始在創建腳本時花的時間完全可以被后來的自動化過程給抵消掉,還有如果我們采用手工的方式的話,我們會經常出錯,並且做很做重復的工作。
好了,現在希望在你的心里已經有個理念就是我們可以從自動化生成中獲得很多好處,那么我們現在開始我們的第一個腳本,讓我們看一下我們的第一個例子,下面是一個ASP .NET MVC web site.
注意看,除了web.config文件, 還存在live.config 和 test.config 文件。現在的想法是:web.config包含所有的關於網站的配置, live.config和test.config僅僅包含那些跟部署環境相關的配置。這樣能避免不同文件中的重復配置導致的頭痛問題。 但是這樣也給我們增加了挑戰,那就是當我進行生成操作時,我們需要把部署環境相關的配置合並到web.confg中。
在開始之前,下面的列出了 構成項目生成的幾個步驟
- · 清理刪除bin目錄下的文件
- · 編譯工程
- · 復制所有的部署需要的文件到一個新的輸出目錄
- · 合並配置文件
- · 部署生成的輸出文件到正確的環境
每一個工程都擁有它自己的生成過程, 但是為了更好的展示,我們的這個相當簡單。
然后,讓我們開始今天的教程,第一步就是添加一個新的XML文件到該網站的根目錄,添加完后, 我們下一步就是清理刪除bin目錄, 目的是服務下一個編譯過程。我們的腳本會是下面這樣
1 <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 2 <Target Name="Clean"> 3 <ItemGroup> 4 <BinFiles Include="bin\*.*" /> 5 </ItemGroup> 6 <Delete Files="@(BinFiles)" /> 7 </Target> 8 </Project>
在這有一些點需要明確的是:
- 引入命名空間是讓Visual Studio 能為MSBuild的功能提供智能提示功能。
- MSBuild 腳本主要是由targets組成,每一個targets都包含一個或tasks。 在這個例子中,我們的target是Clean, 任務是Delete.
- ItemGroups用來定義一組items. 在我們的例子中它定義的是存放在bin文件夾下的所有文件。
- 所有的路徑名,像 bin\ *.*,都是相對於生成腳本自己的。
好的。既然我們已經創建完了第一個target. 讓我們開始執行它。 打開命令行窗口並且把路徑切換到包含你的生成腳本的文件下,執行下面的語句
msbuild Build.xml /t:Clean
如果你遇到MSBuild could not be found的錯誤, 你需要給它指定個全路徑名(我的是C:\Program Files (x86)\MSBuild\12.0\Bin), 或者是添加它的路徑到Path環境變量中, 我個人比較推薦后面一種方式。
運行完這個命令,bin文件夾下應該是空的。為了讓自己看到效果,最好在執行該命令之前確保bin文件夾下是有東西的。
好,讓我們繼續下一步:編譯該工程,為了實現該功能,我們創建了一個Compile的target. 然后用MSBuild task去執行這個編譯過程。
<Target Name="Compile" DependsOnTargets="Clean"> <MSBuild Projects="BuildDemoSite.csproj" /> </Target>
同樣的,我們執行下面的命令,你就可以從命令提示框中看到執行的過程,然后檢查一下自己的項目已經被編譯完成。
msbuild Build.xml /t:Compile
好了,直到現在我們已經完成了:
- 了解生成過程包含什么?
- 決定去實現生成自動化。
- 創建了刪除bin文件夾和編譯工程的targets.