MS2015中的MvcBuildViews需要很长时间

时间:2016-02-11 02:22:48

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

我们正在转换解决方案以使用新的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 个答案:

答案 0 :(得分:4)

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

aspnet_compiler.exe早在之前就已存在,当然,它支持通过<compilation batch="true" />批量编译等内容。为了编译视图,首先必须将CSHTML模板转换为C#(CodeDOM)。不幸的是,这不是编译,所以batch="true"不适用于它。 (in-)实际上,视图按顺序处理,一次一个视图。你添加的任何roslyn功能只会减慢速度,因为必须有一个CodeDOM - &gt;罗斯林转换在某些时候。

这是一个很好的堆栈跟踪,它是在aspnet_compiler.exe中进行批量编译之前发生的事情。

aspnet_compiler.exe foreach loop

注意this AddBuildProvider call(调用GenerateCode)已经在两个foreach循环中。我想batch="true"选项只能加速网站项目中App_Code的编译......

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

enter image description here

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

  • 最明显的论据是,它验证您查看代码。否则,您将在构建服务器上交换编译时错误,以解决生产中的运行时错误。
  • 它的另一个论点是表现。您的视图必须在某个时刻进行编译,如果在编译时没有发生,那么访问您网站的前几个用户必须再次等待生产。