2016-02-11 17 views
6

Wir konvertieren eine Lösung, um den neuen Roslyn-Compiler zu verwenden. Wenn ich es im Release-Modus über teamCity erstelle, verwendet der MVCBuildViews-Schritt immer noch aspnet_compiler.exe und es dauert etwa 15 Minuten, um die Ansichten vorzukompilieren. Der gleiche Prozess nehmen Sie 3 Minuten mit der früheren Version von aspnet_compiler.exe auf .NET 4.5MvcBuildViews in MS2015 dauert eine lange Zeit

Dies ist der Befehl, der eine Weile dauert:

C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ aspnet_compiler.exe -v Temp -p E: \ Pfad \ web \ Projekt \ Directory

habe ich versucht, \ die MSBuild Parameter zwicken, aber nichts geändert. Ist das ein bekanntes Problem? Gibt es irgendwelche Probleme? Muss ich die Ansicht mit Roslyn vorkompilieren? Was ist der Nachteil beim Drehen? Deaktivieren Sie den MVCBuildViews-Schritt, wenn es eine Option ist (ich glaube, dass unsere Entscheidung, bei der Veröffentlichung vorkompilieren, die Ursache für diesen Schritt ist).

Antwort

4

Wir haben das gleiche Problem bei Stack Overflow, deshalb haben wir StackExchange.Precompilation erstellt. Sie können darüber in our announcement blog post lesen, aber hier sind einige blutige technische Details, wie wir natürlich untersucht warumaspnet_compiler.exe war so langsam, bevor Sie unseren eigenen Ersatz dafür schreiben.

aspnet_compiler.exe hat mich um lange vor und , und natürlich, es unterstützte Sachen wie Batchkompilierung über <compilation batch="true" />. Damit eine Ansicht jedoch kompiliert werden kann, muss das CSHTML-Template zuerst in C# (CodeDOM) transformiert werden. Leider ist dies nicht Kompilierung als solche, so batch="true" gilt nicht für sie. (Un) Effektiv werden Ansichten nacheinander in einer Ansicht verarbeitet. Und alle Roslyn-Features, die du hinzufügst, verlangsamen das Ganze nur, weil es irgendwann eine CodeDOM -> Roslyn-Konvertierung geben muss.

Hier ist eine schöne Stapel-Trace, von dem, was passiert, bevor eine Batch Compilation in aspnet_compiler.exe stattfindet.

aspnet_compiler.exe foreach loop

Hinweis this AddBuildProvider call (die GenerateCode nennt) bereits in zwei foreach Schleifen. Ich denke, die batch="true" Optionen immer nur wirksam war die Erstellung von App_Code in Website-Projekte zu beschleunigen, ...

Dies ist, was danach zu unserem Bauzeiten passiert:

enter image description here

Ich würde nicht empfehlen Deaktivieren der Vorkompilierung für jeden, der eine ASP.NET MVC-App in Produktion ausführt.

  • Das naheliegendste Argument dafür ist, dass Sie den Code überprüfen. Andernfalls handeln Sie Kompilierungsfehler auf dem Build-Server für Laufzeitfehler in der Produktion.
  • Das andere Argument dafür ist die Leistung. Ihre Ansichten müssen zu einem bestimmten Zeitpunkt kompiliert werden. Wenn dies nicht zur Kompilierungszeit geschieht, müssen die ersten Benutzer, die Ihre Website aufgerufen haben, erneut in der Produktion warten.
+1

Danke!Ich werde StackExchange.Precompilation erkunden. Und geben Sie Feedback weiter. Ein großes Lob an StackExchange für die gute Arbeit, die Sie leisten. – delloPiro

Verwandte Themen