我们正在转换解决方案以使用新的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步骤的缺点是什么(我相信我们选择在发布时预编译是导致此步骤运行的原因)。
答案 0 :(得分:4)
我们在Stack Overflow遇到了同样的问题,这就是我们创建StackExchange.Precompilation的原因。您可以在our announcement blog post中阅读相关内容,但这里有一些血腥的技术细节,因为我们自然地调查为什么 aspnet_compiler.exe
如此之慢,然后再编写我们自己的替代品
aspnet_compiler.exe
早在asp.net-mvc和razor之前就已存在,当然,它支持通过<compilation batch="true" />
批量编译等内容。为了编译视图,首先必须将CSHTML模板转换为C#(CodeDOM)。不幸的是,这不是编译,所以batch="true"
不适用于它。 (in-)实际上,视图按顺序处理,一次一个视图。你添加的任何roslyn功能只会减慢速度,因为必须有一个CodeDOM - &gt;罗斯林转换在某些时候。
这是一个很好的堆栈跟踪,它是在aspnet_compiler.exe
中进行批量编译之前发生的事情。
注意this AddBuildProvider call(调用GenerateCode)已经在两个foreach
循环中。我想batch="true"
选项只能加速网站项目中App_Code
的编译......
这是我们之后的构建时间发生的事情:
我不建议对生产中运行ASP.NET MVC应用程序的任何人禁用预编译。