為調查TFS Build Service建置失敗,登入TFS Build Service主機使用Visual Studio 2013偵察(在TFS Build Service主機安裝VS2013的原委參見TFS Build Service筆記),Visual Studio回報找不到Oracle.ManagedDataAccess.Client ADO.NET Provider錯誤。

問題根源不難理解,TFS Build Service主機沒有安裝及註冊Managed ODP.NET,只靠NuGet下載相關DLL到專案。依之前的研究

如果要執行Entity Framework,應使用install_odpm.bat,第一個參數為安裝資料夾(將解壓縮內容複製到指定路徑再註冊),第二個參數為x86、x64、both三者擇一,第三個參數則需設為true,將元件加入GAC及在machine.config加入設定。

沒有註冊Managed ODP.NET導致錯誤很合邏輯,但吊詭的部分來了:發現建置失敗原因是缺少NuGet Package,補上後Build Service就可編譯成功,但用VS2013編譯仍維持相同錯誤!

這意味「即使沒有註冊Managed ODP.NET,MSBuild也能成功建置使用Oracle.ManagedDataAccess.Client的EDMX」,但Visual Studio建置則會出錯!為了佐證,在Build Service主機上開啟「VS2013開發者命令提示字元」,使用MSBuild.exe(參考)建置EDMX專案,也可成功編譯。

由以上觀察研判-「按下建置鈕後冒出的錯誤未必是建置錯誤」。深入調查找到兩項佐證:

  1. 由輸出視窗查看建置輸出訊息,建置已順利完成(Rebuild All: 2 successed, 0 failed)
  2. 刪除專案bin目錄下的DLL,即使出現錯誤訊息,Visual Studio仍會順利產生DLL檔。

結論:使用Visual Studio建置專案時在錯誤清單出現的錯誤不一定代表建罝失敗。除了MSBuild作業外,Visual Studio還有其他處理程序也可能產生錯誤(先前有類似案例),但要使用VS偵錯程式,就得乖乖排除。


Comments

# by Ammon

"但要使用VS偵錯程式,就得乖乖排除。" 可以用 Tools->Attach to process 選擇要偵錯的 Process

# by Jeffrey

to Ammon, 對耶,沒想到這招,謝謝分享!

Post a comment