Configuration
構建(調試、發布等)時要使用的配置
Platform
編譯所用的平臺(x86、x64等)
給上面這三個Property賦值用的就是先前定義的Item和Property。OutDir Property用的是BuildArtifacts目錄的全路徑。這里用了%(Item.MetaData) 語法。這個語法應該看起來很眼熟吧?就跟訪問C#對象屬性的語法一樣。MSBuild創建出來的任何Item,都提供了某些元數據以供訪問,例如FullPath和ModifiedTime。但這些元數據有時候也沒啥大用,因為Item不一定是文件。
Configuration和Platform用到了先前定義好的Property,語法格式是$(PropertyName)。在這里可以看到系統保留的一些屬性名,用戶不能更改。定義Property的時候請不要用它們。
這里還有些東西值得提一下。用了Property以后,我們可以在不更改構建腳本的情況下使用不同的Configuration或者BuildPlatform,只要在運行的時候用 /property 傳值進去就行。所以“msbuild HelloCI.msbuild /t:Compile /p:Configuration:Debug”這個命令會用Debug配置構建項目,而“msbuild HelloCI.msbuild /t:Compile /p:Configuration:Test;BuildPlatform:x86”會在x86平臺下使用Test配置。
現在運行Compile,就可以編譯solution下的兩個項目,把編譯結果放到BuildArtifacts目錄下。在完成構建腳本之前,只剩下最后一個Target了:
ItemGroup里現在又多了三個Item:NUnitConsole指向NUnit控制臺運行器(console runner);UnitTestDLL指向單元測試項目生成的DLL文件;TestResultsPath是要傳給NUnit的,這樣測試結果就會放到BuildArtifacts目錄下。
RunUnitTests Target用到了Exec Task。如果有一個測試運行失敗,NUnit控制臺運行器會返回一個非0的結果。這個返回值會告訴MSBuild有個地方出錯了,于是整個構建的狀態就是失敗。
現在這個腳本比較完善了,用一個命令就可以刪除舊的構建產物、編譯、運行單元測試:
C:\HelloCI\> msbuild HelloCI.msbuild /t:RunUnitTests
我們還可以給腳本設一個默認Target,就省得某次都要指定了。在Project元素上加一個DefaultTargets屬性,讓RunUnitTests成為默認Target。
DefaultTargets="RunUnitTests">
你還可以創建自己的Task。這里有個例子,AsyncExec,它允許人們以異步的方式執行命令。比如有個Target用來啟動Web服務器,要是用Exec命令的話,整個構建都會停住,直到服務器關閉。用AsyncExec這個命令可以讓構建繼續執行,不用等待命令執行結束。
本文的完整腳本可以在這里下載。
在接下來的文章中,我會講述如何配置Jenkins。我們不再需要手動運行命令來構建整個項目,Jenkins會檢測代碼庫,一旦有更新就會自動觸發構建。
原文轉自:http://www.anti-gravitydesign.com