Ich muss eine ASP.Net-Webanwendungen (Web Forms und MVC) mit vorkompilieren aktiviert kompilieren. Ich verwende Microsoft.CodeAnalysis.MSBuild.MSBuildWorkspace, um das Projekt zu öffnen und Projektebenen-Assemblys zu senden. Ich habe festgestellt, dass RazorGenerator zur Vorkompilierung verwendet werden kann, aber dies wird meiner Lösung zusätzliche Komplexität hinzufügen. Gibt es eine Möglichkeit, dies einfach mit Roslyn Workspace zu tun?So kompilieren Sie Projekte mit Roslyn Workspace
1
A
Antwort
0
Ich habe folgenden Code entwickelt, um den vorkompilierten Build zu generieren, jedoch ohne viele Operationen auf Dateiebene einen robusteren Weg zu finden.
static void Main(string[] args)
{
//MVC APP
string projectFileName = @"C:\MVCWebApplication\MVCWebApplication\MVCWebApplication.csproj";
string appName = "MVCWebApplication";
//ASP.NET Web Forma App
//string projectFileName = @"C:\AapApp\WebGoat\WebGoat.NET.csproj";
//string appName = "WebGoat.NET";
//Build Artifacts will be drop to this location
string publishDrop = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName());
//aspnet compiler will drop precompiled artifacts to this location
string precompiledDrop = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName());
//Publishing the extension without precompile
var pc = new ProjectCollection();
var globalProperty = new Dictionary<string, string>();
globalProperty.Add("Configuration", "Debug");
globalProperty.Add("Platform", "x86");
globalProperty.Add("OutputPath", publishDrop);
globalProperty.Add("WebPublishMethod", "FileSystem");
globalProperty.Add("EnableUpdateable", "false");
globalProperty.Add("DebugSymbols", "true");
globalProperty.Add("VisualStudioVersion", "14.0");//TODO: Get from IDE
var buidlRequest = new BuildRequestData(projectFileName, globalProperty, null, new string[] { "Build" }, null);
var buildResult = BuildManager.DefaultBuildManager.Build(new BuildParameters(pc), buidlRequest);
//If build errors; then trow
if (buildResult.Exception != null)
{
throw buildResult.Exception;
}
//Rslyn folder not getting created in required location in VS 2015 MVC app template
//https://stackoverflow.com/questions/32780315/could-not-find-a-part-of-the-path-bin-roslyn-csc-exe
//Moving it to proper location manually
string publish = Path.Combine(publishDrop, "_PublishedWebsites", appName);
if (!Directory.Exists(Path.Combine(publish, "bin", "Roslyn")) &&
Directory.Exists(Path.Combine(publishDrop, "Roslyn")))
{
Directory.Move(Path.Combine(publishDrop, "Roslyn"), Path.Combine(publish, "bin", "Roslyn"));
}
//Executing aspnet compiler to get the final output
using (var cmd = new Process())
{
cmd.StartInfo.FileName = @"C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_compiler.exe";
cmd.StartInfo.Arguments = @"-v/-p " + publishDrop + @"\_PublishedWebsites\" + appName + " " + precompiledDrop;
cmd.StartInfo.RedirectStandardInput = true;
cmd.StartInfo.RedirectStandardOutput = true;
cmd.StartInfo.CreateNoWindow = true;
cmd.StartInfo.UseShellExecute = false;
cmd.Start();
cmd.StandardInput.Flush();
cmd.StandardInput.Close();
cmd.WaitForExit();
Console.WriteLine(cmd.StandardOutput.ReadToEnd());
//TODO: Check result for any precompilation errors,
}
//Cleanup files in final precopiled artifact drop
if (Directory.Exists(Path.Combine(precompiledDrop, "bin", "Roslyn")))
{
Directory.Delete(Path.Combine(precompiledDrop, "bin", "Roslyn"), true);
}
Console.ReadKey();
}
+0
Dieser Code funktioniert gut und emittiert erwarteten ouput, aber gibt es eine robustere Möglichkeit, dies zu tun? – Bandara
Verwandte Themen
- 1. Roslyn/Finden Sie Referenzen - Kann Workspace
- 2. Kompilieren eines Syntaxbaums mit Roslyn
- 3. Roslyn: Wie man mehrere Projekte asynchron aktualisiert?
- 4. Wie verwendet man Formatter.Format (SyntaxNode, Workspace) in Roslyn?
- 5. So lesen Sie XML-Dokumentationskommentare mit Roslyn
- 6. Roslyn konnte Code nicht kompilieren
- 7. Kompilieren Sie zwei Projekte in einer Lösung mit ausführbaren MSBuild
- 8. So verstehen Sie bestehende Projekte
- 9. So deaktivieren Sie CodeRush für Roslyn
- 10. Roslyn: So erhalten Sie den Namespace einer DeclarationSyntax mit Roslyn C#
- 11. Ersetzen Sie alle Verbräuche-Klasse roslyn
- 12. Finden Sie Eigenschaft "Invocations" mit Roslyn
- 13. Roslyn: kompilieren Ausdruck mit nicht-öffentlichen Feldern von externen Assembly
- 14. Roslyn Compiler-Version für Projekte verwendet, die Microsoft.Net.Compiler
- 15. So kompilieren Sie C# mit bestimmter Sprachversion
- 16. So kompilieren Sie Bibliothek für mehrere Plattformen
- 17. So kompilieren Sie nur geänderte/neue Dateien mit Flex 4.6
- 18. Eclipse Workspace Backup
- 19. Kompilieren Sie .so in Windows
- 20. So kompilieren Sie VB6-Code
- 21. Eclipse-> Neue Android Projekte kompilieren immer Java 1.4
- 22. Roslyn Service ist null
- 23. Aspektorientierte Programmierung mit Roslyn
- 24. So kompilieren Sie Mono-Projekte von der Befehlszeile auf dem Mac
- 25. So vergleichen Sie Quellcode über TFS-Projekte
- 26. So suchen Sie mehrere Projekte in GitLab
- 27. Kompilieren von Typoskrip mit Webpack für andere Projekte
- 28. Wie kann ich Eclipse-Workspace-Projekte mit der GIT CMD-Desktop-Anwendung an Git weitergeben?
- 29. Jenkins Workspace mit Multi SCM
- 30. So kompilieren Sie Tests mit SBT, ohne sie auszuführen
MSBuildWorkspace ist ein Roslyn-Arbeitsbereich. Ich vermute jedoch, dass RazorGenerator zusätzlichen Quellcode zu dem, was in Ihrem Projekt ist, generiert, so dass die Übertragung aus dem MSBuildWorkspace wahrscheinlich nicht funktioniert, da es nicht die gesamte Quelle hat. –
@MattWarren: Ja Matt Warren, ich musste die Webanwendung in einem Ordner mit MSBuild veröffentlichen und aspnet_comiler.exe verwenden, um die veröffentlichten Artefakte vorkompilieren (Bitte beziehen Sie sich auf meine Antwort). Diese Methode generiert erforderliche Binärdateien, aber ich suche nach einem robusteren Code dafür, vielleicht MSBuild und aspnet_compiler.exe zu vermeiden – Bandara