大型預編譯 Asp.net 網站項目中的錯誤 CS0433
背景
我已經接管了一個非常大的 asp.net 網站項目。舊的部署過程是將 .cs、.aspx 和 .ascx 文件複製到 IIS 並使其即時建構。我想預編譯它並使用 TeamCity 自動部署它。我已經用其他一些網站項目做到了這一點。
該項目有大約 350 個使用者控制項,這些控制項很好地組織在文件夾中,但可以在任何地方使用。從其他文件夾引用的控制項,相互引用…基本上是循環文件引用的噩夢。
我的嘗試
我的第一次嘗試是像其他人一樣建構它。MSbuild 整個 vs2012 解決方案。我遇到了大量的“不允許循環文件引用”。來發現所有這些井井有條的控制項到處都在使用,並且到處都有循環引用。我閱讀了這篇文章並將“web.config”切換到
compilation batch="false"然後在建構中將站點設置為“不可更新”和“使用固定命名程序集”。該站點已建構,但在我的四核、ssd、16gb ram 開發盒上編譯需要 25 分鐘。這是不可接受的建構時間。我知道,如果我關閉“使用固定命名程序集”,該網站的建構速度會大大加快。(我已經在一個較小的網站上證明了這一點。它從 4 分鐘縮短到了 45 秒)。當我刪除該設置時,我會遇到奇怪的建構錯誤:
c:\Projects\Web\Site.master(146): error CS0433: The type 'ASP.usercontrols_modules_viewprofilepopup_ascx' exists in both 'c:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\web\8d37b2c6\4c39f0a\App_Web_viewprofilepopup.ascx.4101713c.dll' and 'c:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\web\8d37b2c6\4c39f0a\App_Web_xa514so5.dll' c:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\web\8d37b2c6\4c39f0a\App_Web_site.master.cdcab7d2.0.cs(927): error CS0433: The type 'ASP.usercontrols_modules_viewprofilepopup_ascx' exists in both 'c:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\web\8d37b2c6\4c39f0a\App_Web_viewprofilepopup.ascx.4101713c.dll' and 'c:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\web\8d37b2c6\4c39f0a\App_Web_xa514so5.dll' error ASPPARSE: c:\Projects\web\Web\UserControls\Modules\JobsLeftMenu.ascx(128): error CS0433: The type 'ASP.usercontrols_modules_imagesgallerymodule_ascx' exists in both 'c:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\web\8d37b2c6\4c39f0a\App_Web_imagesgallerymodule.ascx.4101713c.dll' and 'c:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\web\8d37b2c6\4c39f0a\App_Web_nvrj33tx.dll' error ASPPARSE: c:\Projects\web\Web\Site.master(146): error CS0433: The type 'ASP.usercontrols_modules_viewprofilepopup_ascx' exists in both 'c:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\web\8d37b2c6\4c39f0a\App_Web_viewprofilepopup.ascx.4101713c.dll' and 'c:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\web\8d37b2c6\4c39f0a\App_Web_xa514so5.dll'這是確切的 aspnet_compiler.exe 命令:
aspnet_compiler.exe -v /web -p Web\ -f “預編譯的 Web”
我四處搜尋答案。不,它們不會在任何地方的程式碼中重複。它們恰好位於不同的文件夾中,由不同文件夾中的其他控制項使用。我有一種感覺,這是由於循環文件引用的事情。好的。我刪除了其中一些的使用,以查看它是否會建構,並且建構過程會轉移到其他錯誤,就像這個錯誤一樣。我不能完全刪除程式碼以適應這一點……如何在不打開“使用固定命名程序集”的情況下修復這些錯誤?
我試過的東西
- 清除了
Temporary ASP.NET Files整個系統中的所有內容。- 在visual studio 2012中嘗試了“發布”。同樣的錯誤。
- 嘗試將站點轉換為 Web 應用程序,但錯誤太多(超過 600 個)。
- 再次:確保沒有重複的文件和程式碼可以解釋它。我使用 notepad++ 對整個解決方案文件夾進行了文本搜尋,以驗證沒有其他同名控制項。
- 檢查了這個。
- 我打開了 msbuild 性能調整:
/m /p:CreateHardLinksForCopyLocalIfPossible=true /p:BuildInParallel=true我很困惑,似乎認為我唯一的選擇是重寫應用程序,在轉換為 Web 應用程序時克服錯誤,或者繼續將原始碼部署到網路伺服器但自動執行。
我知道你已經嘗試過了,但是避免循環引用將是你最好的選擇。請注意,“循環引用”一詞實際上並不完全正確。建構系統抱怨的是目錄級別的循環引用,而不是文件級別。
例如
sub1\page.aspx使用sub2\uc1.ascx用途sub1\uc2.ascx在文件級別,沒有圓圈,但在目錄級別有,這與批處理的工作方式相混淆。
雖然看起來你有很多這樣的情況,以至於無法修復,但我敢打賭,如果你看看“目錄圈”的細節,那肯定不是那麼多。繪製參考圖可能有助於理解事物。
然後,您只需將違規者移動到不同的文件夾並相應地更改連結。
是的,這是一個痛苦的過程,但它可能是可以解決的。