c# - MS2015 中的 MvcBuildViews 需要很长时间

标签 c# msbuild visual-studio-2015 teamcity roslyn

我们正在转换一个解决方案以使用新的 Roslyn 编译器。当我在 Release模式下通过 teamCity 构建它时,MVCBuildViews 步骤仍然使用 aspnet_compiler.exe,预编译 View 大约需要 15 分钟。在 .NET 4.5 上使用以前版本的 aspnet_compiler.exe,相同的过程过去需要 3 分钟

这是需要一段时间的命令:

C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_compiler.exe -v temp -p E:\path\to\web\project\Directory

我尝试调整 MSBuild 参数但没有任何改变。这是一个已知问题吗,是否有任何解决方法,我是否需要使用 Roslyn 预编译 View ? 如果它是一个选项,关闭 MVCBuildViews 步骤的缺点是什么(我相信我们选择在发布时预编译是导致此步骤运行的原因)。

最佳答案

我们在 Stack Overflow 遇到了同样的问题,这就是我们创建 StackExchange.Precompilation 的原因.您可以在 our announcement blog post 中阅读相关信息,但这里有一些血淋淋的技术细节,因为我们很自然地调查了为什么 aspnet_compiler.exe在编写我们自己的替代品之前太慢了。

aspnet_compiler.exe很久以前就有了 ,当然,它通过 <compilation batch="true" /> 支持批量编译等功能.不过,为了编译 View ,必须首先将 CSHTML 模板转换为 C# (CodeDOM)。不幸的是,这不是编译,所以batch="true"不适用于它。 (in-) 实际上, View 是按顺序处理的,一次处理一个 View 。您在其上添加的任何 roslyn 功能只会减慢它的速度,因为在某些时候必须进行 CodeDOM -> roslyn 转换。

这是一个很好的堆栈跟踪,说明了在 aspnet_compiler.exe批处理 编译之前发生的事情。发生。

aspnet_compiler.exe foreach loop

公告this AddBuildProvider call (调用 GenerateCode )已经在两个 foreach 内循环。我猜 batch="true" options 只对加速 App_Code 的编译有效在网站项目中...

这是我们构建时间之后发生的事情:

enter image description here

我不建议任何在生产环境中运行 ASP.NET MVC 应用程序的人禁用预编译。

  • 最明显的论据是,它验证您是否查看了代码。否则,您将在生产环境中用构建服务器上的编译时错误换取运行时错误。
  • 支持它的另一个论据是性能。您的 View 必须在某个时间点进行编译,如果在编译时没有编译,那么前几个访问您网站的用户必须在生产环境中再次等待。

关于c# - MS2015 中的 MvcBuildViews 需要很长时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35329717/

相关文章:

c++ - VC++ 可再发行版 2012 或 2013 或 2015?

c# - 在一个数组中找到一个接口(interface)的具体实现,并移动到数组的顶部

c# - EntityFramework MySQL 检索结果进行计数

visual-studio-2010 - MSBuild Hudson 服务器上的 VC Express 项目 (IncludePath)

azure-devops - 如何解决尝试在 Windows Server 2019 上的 Visual Studio 2022 上构建 Azure DevOps 代码时显示的以下错误

android-emulator - Visual Studio Preview 2015 缺失 "VS Emulator Android Phone"

c# - 当有 Start 和 Stop 方法时使用 Reactive Extensions 包装事件

c# - try catch 异步异常

qt - 在windows 32位系统上使用msbuild构建解决方案文件

c++ - 如何防止Visual Studio 2015 Update 2 添加telemetry_main_invoke_trigger?