[技術探討]於客戶環境進行自動化編譯- MsBuild 的使用探討

MsBuild的使用

今年度陸續完成兆豐銀行簡訊以及華南銀行簡訊系統建置專案,並配合銀行內控規範須交付完整原始碼,且要在他們提供的開發環境進行編譯後,才能部署到正式環境做上線;但同時因為需要提供多個網站與服務共同建構起簡訊系統,才能提供完整的服務,故最好是提供一個一鍵建置的方式。
本公司的專案管理與開發,是採用微軟的Visual Studio 2015進行開發與管理,故在本篇文章中,介紹如何使用msbuild這個執行檔達到各式自動化編譯的需求。

首先MsBuild.exe所在的目錄為C:\Program Files (x86)\MSBuild\14.0\Bin\,所以要先將Command Line的執行環境切換到此目錄,才能執行MsBuild指令。

1. 基本語法:不論任何類型的專案,只要給予.sln完整路徑,及輸出目錄的參數,即可編譯成功。

Msbuild [sln路徑] /p:OutDir=[輸出目錄]

2. 網站的編譯:網站類型的專案,如果使用基本語法編譯,輸出目錄的結果如下圖,第一層為_PublishedWebsites、roslyn、zh-Hant目錄,第二層_PublishedWebsites下的網站A、網站B則為實際部署的內容。
假設網站A與網站B均有使用Nuget套件,部署完連線時會出現錯誤訊息『找不到路徑 ‘網站路徑\bin\roslyn\csc.exe’ 的一部分。』。解決方式是要另外複製下圖中的roslyn目錄到網站A\bin下及網站B\Bin下,原因是輸出目錄的第一層為置放暫存目錄與組件的地方,實際部署用的組件是放在_PublishedWebsites路徑下,但zh-Hant目錄有複製到網站A\bin下及網站B\Bin下,roslyn目錄卻沒有複製到。

msbuild
最佳解決方法是先設定好網站A和網站B的發行設定檔,於Web專案→按右鍵→發行,即可設定發行設定檔,下圖紅框處則為自訂的發行設定檔名稱。

msbuild

然後MsBuild的參數增加/p: PublishProfile=[發行設定檔名稱]。當然若使用此參數,輸出目錄則會使用發行設定檔裡的輸出路徑,且輸出目錄裡存放的即是可直接部署的組件,不會有暫存目錄與組件的存在。

Msbuild [sln路徑] /p:PublishProfile=[發行設定檔名稱]

 

3.方案內含多個專案的編譯:採用基本語法編譯時會把所有的專案輸出檔都輸出到同一個目錄下,假設此方案有一個類別庫專案、一個Windows服務專案、一個測試專案,部署時只需要類別庫專案與Windows服務專案做部署,這樣輸出目錄下就會多了測試專案裡不必要的組件。此時可加入參數/t:專案名稱,指定要輸出的特定專案。

Msbuild [sln路徑] /t:[專案1名稱];[專案2名稱] /p:OutDir=[輸出目錄]

4.編譯時自動更名組件名稱:假設有一個Windows服務專案,需要編譯成多個不同名稱的組件,才能以多個服務的形式安裝在同一台機器上,此時可加入參數/p:CustomizedAssemblyName=[欲修改的組件名稱],來達到自動更名的目的。

Msbuild [sln路徑] /p:OutDir=[輸出目錄A] /p:CustomizedAssemblyName=[組件名稱A]
Msbuild [sln路徑] /p:OutDir=[輸出目錄B] /p:CustomizedAssemblyName=[組件名稱B]

5.其他注意事項:若專案裡有已編譯過的obj檔,使用MsBuild並不會重新編譯而是繼續沿用該obj檔,若要確保此次編譯是重新編譯,可加入參數/t:Clean,Build。

Msbuild [sln路徑] /t:Clean;Build /p:OutDir=[輸出目錄]

Ref: https://msdn.microsoft.com/zh-tw/library/dd393574.aspx

Ref: http://stackoverflow.com/questions/13915636/specify-project-file-of-a-solution-using-msbuild

Comments

No comments yet. Why don’t you start the discussion?

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料