接獲報案,Web Site Project 配合 Web Deployment Project 編譯,使用 CruiseControl.NET自動部署,於本機編譯測試正常,但部署後出現物件重複出現在兩個 DLL的錯誤訊息:
Compiler Error Message: CS0433: The type 'UserContrl_HeadInfo' exists in both 'c:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\fx\ca083b06\95835c45\assembly\dl3\2b9d72d9\c2f28c5d_0e8cce01\FX_deploy.DLL' and 'c:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\fx\ca083b06\95835c45\assembly\dl3\8fdf26e7\d13146b8_82c6cf01\FX.UserContrl.DLL'
太久沒用 Web Site Project,花了點時間大腦才從 MVC Context Switch 切回Web Site,其實錯誤訊息已經很明確,時間卻大部分花在重新熟悉 Web Deployment Project,這就是中年茶包射手執勤的寫照吧? XD
深入調查,Web Deployment Project 專案被設成每個資料夾編譯為單一組件(Assembly), HeadInfo 位於 UserContrl 目錄下,出現在 FX.UserContrl.DLL 很合理;跟它打架的另一顆元件 FX_deploy.DLL 是整個網站編譯成單一組件的產物,理論上跟 FX.UserContrl.DLL 互斥,二者不該並存,也因此導致錯誤。
Web Deployment Project 每之編譯會清空輸出目錄,不致出現矛盾, CruiseControl.NET 自動部署看來是本案最後一塊拼圖。ccNet 是透過 robocopy 複製檔案到網站主機,不可能每次都將目的地的檔案全部刪除換上新檔案,而是採取「新増或複寫」做法。而本案的關鍵在於一開始 Web Deployment Project 被錯設為編譯單一組件,自動部署後網站 bin 目錄便有了 FX_deploy.DLL;接著設定改為每個資料夾一顆組件後再次部署,FX_deploy.DLL 未刪,FX.UserContrl.DLL 就位,碰!
知道原因,將 FX_deploy.DLL 刪除,問題排除,收工!