MS2015中的MvcBuildViews需要很长时间。

7
我们正在将一个项目改为使用新的Roslyn编译器。当我通过TeamCity以发布模式构建它时,MVCBuildViews步骤仍然使用aspnet_compiler.exe,并且需要大约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预编译视图?如果可以,关闭MVCBuildViews步骤会带来什么影响(我相信我们选择在发布时预编译导致运行此步骤)。
1个回答

6
我们在 Stack Overflow 遇到了同样的问题,这就是为什么我们创建了 StackExchange.Precompilation。您可以在 我们的公告博客文章 中阅读相关信息,但以下是一些血淋淋的技术细节,因为我们自然而然地调查了 为什么 aspnet_compiler.exe 如此缓慢,然后编写了我们自己的替代品。

aspnet_compiler.exe之前就已经存在了,当然,它支持像<compilation batch="true" />这样的批量编译。但是,为了编译视图,CSHTML模板必须首先被转换为C#(CodeDOM)。不幸的是,这不是真正的编译,因此batch="true"并不适用于它。实际上,视图按顺序一个一个地处理。而且,你在其上添加的任何roslyn功能都会使它变慢,因为必须在某个时候进行CodeDOM -> roslyn转换。

以下是在aspnet_compiler.exe进行批量编译之前发生的情况的完整堆栈跟踪。

aspnet_compiler.exe foreach loop

注意 this AddBuildProvider call (调用了 GenerateCode) 已经在两个 foreach 循环中。我猜测 batch="true" 选项只对网站项目中的 App_Code 编译速度有影响...

之后我们的构建时间发生了以下变化:

enter image description here

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

  • 最显而易见的理由是,它可以验证您的视图代码。否则,您会将编译时错误与运行时错误在生产环境中交换。
  • 另一个理由是性能。您的视图必须在某个时刻进行编译,如果不在编译时进行,则在生产环境中,首批用户需要等待。

1
谢谢!我会探索StackExchange.Precompilation,并传递任何反馈。向你们在StackExchange所做的出色工作致敬。 - delloPiro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接