背景
我已经接管了一个非常大的 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 应用程序时克服错误,或者继续将源代码部署到网络服务器但自动执行。