VSTS之Build(CI)自動化建置與XML組態轉換的神秘關係

VSTS之Build(CI)自動化建置與XML組態轉換的神秘關係

關於的Web.config瞭解與使用,在開發的網站規模越來越大時,需要瞭解的越多,之前也做有幾次的討論:

但這一次是碰到VSTS在自動化建置後產出Web.config一直不正常,一開始有點鬼打牆的狀態,但在新聞追追追的精神下,讓我又對Web.config組熊轉換又更進一步瞭解。

自訂XML組態轉換

因為專案環境比較複雜,區分本機、開發區、Azure區、正式區等,不同區域有不同組態設定,所以會建立自訂多個XML組態:

XML Configuration
XML Configuration

而且專案已經加入自動轉換組態的設定:

<Target Name="BeforeBuild">
    <TransformXml Source="Web.config" Transform="Web.$(Configuration).config" Destination="Web.config" />
</Target>

也就是當切換【圖一】設定,建置會自動進行Web.config文件轉換功能,例如,平常都是在本機開發,會設定到Local組態:

Configuration Manager

VSTS Build與Realse

團隊導入 VSTS 的 Build(CI) / Realse(CD) 功能許久,在本機測試完成簽入之後,Build → Realse 進入develop(開發區)主機,但功能怎麼測試都會發生錯誤,經過不斷比對與查詢,終於找到第一條線索,develop主機上的Web.config組態居然是吃Web.Local.config的設定。重新確定VSTS Build(CI)的BuildConfiguration環境變數,發現值為小寫debug,抱著之前都可以用的心態,本來不應該懷疑它,但還是把它改為大寫Debug。從VSTS Build(CI)日誌看到結果:沒用

2017-09-20T07:44:49.4405911Z BeforeBuild:
2017-09-20T07:44:49.4405911Z   Transforming Source File: Web.config
2017-09-20T07:44:49.4695945Z     Applying Transform File: Web.Local.config
2017-09-20T07:44:49.5435994Z     Output File: Web.config
2017-09-20T07:44:49.5906018Z   Transformation succeeded

農曆8月初一(2017-09-20),應該不是發現這種怪事的時機點,是什麼神密的力量,連VSTS都被影響到,只吃Local不理BuildConfiguration組態設定!

組態變更

回到Visual Studio專案身上,注意看最前面的那三張圖,在組態管理員裡,因為我在本機開發關係是指定Local組態,但當我切換回Debug模式可以發現神秘的*.sln*被修改了,為什麼說神秘!你自己看比對圖:

vs sln compare

有時Visual Studio的git機制會誤判,會把沒修改的檔案也納入,通常只需要按一下【Ctrl+S】就會自動消失在Changes列表上。但這支組態變更影響的*.sln*和VSTS情況一樣不受此規則影響,儲存按了也不消失,這一定有什麼黑力量!抱著死馬醫醫看的心情,簽入試試看,結果:Bing Go!Debug組態的Web.config回來了。

2017-09-20T10:51:43.4598495Z BeforeBuild:
2017-09-20T10:51:43.4598495Z   Transforming Source File: Web.config
2017-09-20T10:51:43.4808131Z     Applying Transform File: Web.Debug.config
2017-09-20T10:51:43.5288542Z     Output File: Web.config
2017-09-20T10:51:43.5678264Z   Transformation succeeded

一定是我有什麼誤會,在VSTS找到一切的答案:

vsts commit file diff

這問題,我回報在這,歡迎大家Vote一下。

以下是有問題的內容:

GlobalSection(ProjectConfigurationPlatforms) = postSolution
    {8985B730-6560-4772-AF7A-B9FA55EB88BF}.Debug|Any CPU.ActiveCfg = Local|Any CPU
    {8985B730-6560-4772-AF7A-B9FA55EB88BF}.Debug|Any CPU.Build.0 = Local|Any CPU
EndGlobalSection

以下是正確的內容:

GlobalSection(ProjectConfigurationPlatforms) = postSolution
 {8985B730-6560-4772-AF7A-B9FA55EB88BF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 {8985B730-6560-4772-AF7A-B9FA55EB88BF}.Debug|Any CPU.Build.0 = Debug|Any CPU
EndGlobalSection

VSTS的BuildConfiguration環境變數沒有問題,它指定使用Debug,而在建置轉換組態也是採用Debug|Any CPU這條設定,問題在後面ActiveCfg = Local|Any CPUBuild.0 = Local|Any CPU,很明顯它會拿Local組態來使用。這一切都說得通了,為什麼VSTS會拿Local組態來轉換為Web.config的內容。

沒有留言:

張貼留言

感謝您的留言,如果我的文章你喜歡或對你有幫助,按個「讚」或「分享」它,我會很高興的。