利用改寫要執行的Target的方式讓後來的人可以改變流程

最近在使用MSBuild的專案批次建置專案時,發現有些專案中,它會需要一些特別的流程。例如在引用的DLL中,大部份都是需要xxx.DLL,但可能有某個特別的專案,就是要引用到其它名稱的DLL。這樣的特例可能就無法寫在固定的流程中給所有要編譯的專案來執行了。

那要怎樣才能讓每個專案在要進行編譯前,可以準備好自己所需要參考到的檔案呢(這裏說檔案是因為不一定就是DLL,可能是其它種類的檔案)

目前我的作法就是在既定的編譯流程中,加入一個叫作SlnBeforeBuild的target。如果要編譯的專案沒有自已要特別執行的作業的話,就不用改寫這個target。

例如我有個編譯用的MyBuild.proj,在MyBuild.proj會去引入DefaultSlnBeforeBuild.proj。而DefaultSlnBeforeBuild.proj的程式碼大致上如下:


<project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 

<target name="SlnBeforeBuild">
<message text="Default sln BeforeBuild">
</message></target>

</project>

在DefaultSlnBeforeBuild.proj中定義了一個叫作SlnBeforeBuild的target。這個Target在MyBuild.proj時會被執行到。

一般的狀況下都不用改寫SlnBeforeBuild這個target。但如果有需要時,可以在每個專案的proj中,在它引用了MyBuild.proj後,再寫一段自已的SlnBeforeBuild的target。這樣就可以達到改寫的功能,當MyBuild.proj中要呼叫到SlnBeforeBuild這個target時,就會改執行新改寫的內容了。

會有這樣的結果,我猜應該是MSBuild在執行時,所引入的專案中的任何資料,都是以最後的為主。也就是後面的會蓋掉前面的。

留言

這個網誌中的熱門文章

DOS Batch指令檔中如何記錄log資訊

用捷徑方式執行需帶入命令列參數的Windows Form程式

使用regular expression來match中括號(square bracket)