【问题标题】:MvcBuildViews in MS2015 takes a long timeMS2015 中的 MvcBuildViews 耗时较长
【发布时间】:2016-05-21 15:52:45
【问题描述】:

我们正在转换解决方案以使用新的 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 步骤有什么缺点(我相信我们选择在发布时预编译是导致此步骤运行的原因)。

【问题讨论】:

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


    【解决方案1】:

    我们在 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 -> roslyn 转换。

    这是一个很好的堆栈跟踪,说明在 aspnet_compiler.exe 中的 batch 编译发生之前发生了什么。

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

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

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

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

    【讨论】:

    • 谢谢!我将探索 StackExchange.Precompilation。并传递任何反馈。感谢 StackExchange 的你们所做的出色工作。
    猜你喜欢
    • 2011-10-05
    • 2016-06-07
    • 1970-01-01
    • 1970-01-01
    • 2011-07-05
    • 1970-01-01
    • 1970-01-01
    • 2017-06-21
    • 2016-12-22
    相关资源
    最近更新 更多