From 34f81edf8cf5335ce340614be7375c908a7b2df8 Mon Sep 17 00:00:00 2001 From: token <239573049@qq.com> Date: Tue, 21 Mar 2023 15:42:29 +0800 Subject: [PATCH 1/5] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=BC=96=E8=AF=91Blazor?= =?UTF-8?q?=E6=B3=9B=E5=9E=8B=E7=BB=84=E4=BB=B6=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: token <239573049@qq.com> --- .../Options/CompileRazorOptions.cs | 2 + .../RazorCompile.cs | 77 +++++++++++-------- 2 files changed, 45 insertions(+), 34 deletions(-) diff --git a/src/Languages/Masa.Blazor.Extensions.Languages.Razor/Options/CompileRazorOptions.cs b/src/Languages/Masa.Blazor.Extensions.Languages.Razor/Options/CompileRazorOptions.cs index fa889d4..3dc0a00 100644 --- a/src/Languages/Masa.Blazor.Extensions.Languages.Razor/Options/CompileRazorOptions.cs +++ b/src/Languages/Masa.Blazor.Extensions.Languages.Razor/Options/CompileRazorOptions.cs @@ -22,4 +22,6 @@ public class CompileRazorOptions /// (WebAssembly does not support multiple threads using concurrency) /// public bool ConcurrentBuild { get; set; } = false; + + public OptimizationLevel OptimizationLevel { get; set; } = OptimizationLevel.Release; } \ No newline at end of file diff --git a/src/Languages/Masa.Blazor.Extensions.Languages.Razor/RazorCompile.cs b/src/Languages/Masa.Blazor.Extensions.Languages.Razor/RazorCompile.cs index 714480b..c558745 100644 --- a/src/Languages/Masa.Blazor.Extensions.Languages.Razor/RazorCompile.cs +++ b/src/Languages/Masa.Blazor.Extensions.Languages.Razor/RazorCompile.cs @@ -1,13 +1,15 @@ -namespace Masa.Blazor.Extensions.Languages.Razor; +using System.Text.Json; + +namespace Masa.Blazor.Extensions.Languages.Razor; public class RazorCompile { private static List? _references; - - private static TagHelperDescriptor[]? _tagHelpers; - + private static List? _extensions; + private static RazorProjectEngine _engine; + /// /// Component initialization Initializes components before compilation /// @@ -18,17 +20,35 @@ public static void Initialized(List? refs, List + { + builder.SetRootNamespace(Constant.ROOT_NAMESPACE); + builder.AddDefaultImports(CompileRazorProjectFileSystem.GlobalUsing); + + CompilerFeatures.Register(builder); + builder.Features.Add(new CompilationTagHelperFeature()); + builder.Features.Add(new DefaultMetadataReferenceFeature + { + References = _references + }); + }); } public static Type? CompileToType(CompileRazorOptions razorOptions) { var assembly = CompileToAssembly(razorOptions); - + if (assembly == null) { return null; } - + return assembly.GetType(Constant.ROOT_NAMESPACE.EndsWith(".") ? Constant.ROOT_NAMESPACE : Constant.ROOT_NAMESPACE + "." + razorOptions.ComponentName); @@ -37,12 +57,12 @@ public static void Initialized(List? refs, List? refs, List - { - builder.Features.Add(new DefaultMetadataReferenceFeature - { - References = _references - }); - builder.Features.Add(new CompilationTagHelperFeature()); - builder.Features.Add(new DefaultTagHelperDescriptorProvider()); - CompilerFeatures.Register(builder); - }); - _tagHelpers = razorProjectEngine.Engine.Features.OfType().Single().GetDescriptors().ToArray(); - } + ArgumentNullException.ThrowIfNull(_extensions); - var engine = RazorProjectEngine.Create(config, proj, - builder => { builder.Features.Add(new CompileRazorCodeGenerationOptionsFeature() { TagHelpers = _tagHelpers }); }); + ArgumentNullException.ThrowIfNull(_engine); var codeRenderingProjectItem = new CompileRazorProjectItem() { @@ -90,17 +88,28 @@ public static void Initialized(List? refs, List("CS1701", ReportDiagnostic.Suppress), + new KeyValuePair("CS1702", ReportDiagnostic.Suppress), + }, concurrentBuild: razorOptions.ConcurrentBuild)) // TODO: If it is WebAssembly you need to cancel the concurrency otherwise it will not work .AddSyntaxTrees(syntaxTree) .AddReferences(_references); From 85db7fe2dcc00b44ccbceda3ba65a983c2baee80 Mon Sep 17 00:00:00 2001 From: token <239573049@qq.com> Date: Wed, 29 Mar 2023 18:57:52 +0800 Subject: [PATCH 2/5] add Multiple Compile Signed-off-by: token <239573049@qq.com> --- .../Options/CompileFileRazorOptions.cs | 9 ++ .../Options/CompileMultipleRazorOptions.cs | 24 +++++ .../README.md | 6 +- .../README.zh-CN.md | 6 +- .../RazorCompile.cs | 88 +++++++++++++++---- 5 files changed, 112 insertions(+), 21 deletions(-) create mode 100644 src/Languages/Masa.Blazor.Extensions.Languages.Razor/Options/CompileFileRazorOptions.cs create mode 100644 src/Languages/Masa.Blazor.Extensions.Languages.Razor/Options/CompileMultipleRazorOptions.cs diff --git a/src/Languages/Masa.Blazor.Extensions.Languages.Razor/Options/CompileFileRazorOptions.cs b/src/Languages/Masa.Blazor.Extensions.Languages.Razor/Options/CompileFileRazorOptions.cs new file mode 100644 index 0000000..b832197 --- /dev/null +++ b/src/Languages/Masa.Blazor.Extensions.Languages.Razor/Options/CompileFileRazorOptions.cs @@ -0,0 +1,9 @@ +namespace Masa.Blazor.Extensions.Languages.Razor; + +public class CompileFileRazorOptions +{ + public string Code { get; set; } + + public string FileName { get; set; } + +} \ No newline at end of file diff --git a/src/Languages/Masa.Blazor.Extensions.Languages.Razor/Options/CompileMultipleRazorOptions.cs b/src/Languages/Masa.Blazor.Extensions.Languages.Razor/Options/CompileMultipleRazorOptions.cs new file mode 100644 index 0000000..d250d3c --- /dev/null +++ b/src/Languages/Masa.Blazor.Extensions.Languages.Razor/Options/CompileMultipleRazorOptions.cs @@ -0,0 +1,24 @@ +namespace Masa.Blazor.Extensions.Languages.Razor; + +public class CompileMultipleRazorOptions +{ + public List FileRazorOptions { get; set; } + + /// + /// Configuration Name + /// + public string ConfigurationName { get; set; } = "Default"; + + public string AssemblyName { get; set; } + + /// + /// Whether to Build concurrently + /// (WebAssembly does not support multiple threads using concurrency) + /// + public bool ConcurrentBuild { get; set; } = false; + + /// + /// Determines the level of optimization of the generated code. + /// + public OptimizationLevel OptimizationLevel { get; set; } = OptimizationLevel.Release; +} \ No newline at end of file diff --git a/src/Languages/Masa.Blazor.Extensions.Languages.Razor/README.md b/src/Languages/Masa.Blazor.Extensions.Languages.Razor/README.md index b0f3c47..1452374 100644 --- a/src/Languages/Masa.Blazor.Extensions.Languages.Razor/README.md +++ b/src/Languages/Masa.Blazor.Extensions.Languages.Razor/README.md @@ -17,7 +17,7 @@ async Task?> GetReference() var httpClient = service.GetService(); var portableExecutableReferences = new List(); - foreach (var asm in AppDomain.CurrentDomain.GetAssemblies()) + foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies()) { try { @@ -39,12 +39,12 @@ async Task?> GetReference() #region Server var portableExecutableReferences = new List(); - foreach (var asm in AppDomain.CurrentDomain.GetAssemblies()) + foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies()) { try { // Server is running on the Server and you can get the file directly if you're a Hybrid like Maui Wpf you don't need to get the file through HttpClient and you can get the file directly like server - portableExecutableReferences?.Add(MetadataReference.CreateFromFile(v.Location)); + portableExecutableReferences?.Add(MetadataReference.CreateFromFile(assembly.Location)); } catch (Exception e) { diff --git a/src/Languages/Masa.Blazor.Extensions.Languages.Razor/README.zh-CN.md b/src/Languages/Masa.Blazor.Extensions.Languages.Razor/README.zh-CN.md index a56740a..cb247a9 100644 --- a/src/Languages/Masa.Blazor.Extensions.Languages.Razor/README.zh-CN.md +++ b/src/Languages/Masa.Blazor.Extensions.Languages.Razor/README.zh-CN.md @@ -17,7 +17,7 @@ async Task?> GetReference() var httpClient = service.GetService(); var portableExecutableReferences = new List(); - foreach (var asm in AppDomain.CurrentDomain.GetAssemblies()) + foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies()) { try { @@ -39,12 +39,12 @@ async Task?> GetReference() #region Server var portableExecutableReferences = new List(); - foreach (var asm in AppDomain.CurrentDomain.GetAssemblies()) + foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies()) { try { // Server是在服务器运行可以直接获取文件 如果是Maui Wpf这种Hybrid开发的话不需要通过HttpClient获取可以跟Server一样直接读取文件 - portableExecutableReferences?.Add(MetadataReference.CreateFromFile(asm.Location)); + portableExecutableReferences?.Add(MetadataReference.CreateFromFile(assembly.Location)); } catch (Exception e) { diff --git a/src/Languages/Masa.Blazor.Extensions.Languages.Razor/RazorCompile.cs b/src/Languages/Masa.Blazor.Extensions.Languages.Razor/RazorCompile.cs index c558745..4827e97 100644 --- a/src/Languages/Masa.Blazor.Extensions.Languages.Razor/RazorCompile.cs +++ b/src/Languages/Masa.Blazor.Extensions.Languages.Razor/RazorCompile.cs @@ -1,11 +1,11 @@ -using System.Text.Json; +using Microsoft.CodeAnalysis.CSharp; namespace Masa.Blazor.Extensions.Languages.Razor; public class RazorCompile { private static List? _references; - + private static List? _extensions; private static RazorProjectEngine _engine; @@ -98,21 +98,15 @@ public static void Initialized(List? refs, List v.Severity == RazorDiagnosticSeverity.Error) + .ToString()); } - var syntaxTree = Microsoft.CodeAnalysis.CSharp.CSharpSyntaxTree.ParseText(targetCode); - var cSharpCompilation = Microsoft.CodeAnalysis.CSharp.CSharpCompilation.Create($"new{Guid.NewGuid():N}") - .WithOptions(new Microsoft.CodeAnalysis.CSharp.CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary, - optimizationLevel: razorOptions.OptimizationLevel, - specificDiagnosticOptions: new[] - { - new KeyValuePair("CS1701", ReportDiagnostic.Suppress), - new KeyValuePair("CS1702", ReportDiagnostic.Suppress), - }, - concurrentBuild: razorOptions.ConcurrentBuild)) // TODO: If it is WebAssembly you need to cancel the concurrency otherwise it will not work - .AddSyntaxTrees(syntaxTree) - .AddReferences(_references); + var syntaxTree = CSharpSyntaxTree.ParseText(targetCode); + + var cSharpCompilation = + CreateCSharpCompilation($"new{Guid.NewGuid():N}", razorOptions.OptimizationLevel, + razorOptions.ConcurrentBuild, syntaxTree); using MemoryStream ms = new(); var result = cSharpCompilation.Emit(ms); @@ -121,4 +115,68 @@ public static void Initialized(List? refs, List(); + foreach (var fileRazorOption in multipleRazorOptions.FileRazorOptions) + { + var codeRenderingProjectItem = new CompileRazorProjectItem() + { + Name = fileRazorOption.FileName, + Code = fileRazorOption.Code + }; + + var razorDoc = _engine.Process(codeRenderingProjectItem); + var cSharpDocument = razorDoc.GetCSharpDocument(); + + var targetCode = cSharpDocument.GeneratedCode; + + if (string.IsNullOrWhiteSpace(targetCode)) + continue; + + if (cSharpDocument.Diagnostics.Count != 0) + { + throw new Exception(cSharpDocument.Diagnostics.First(v => v.Severity == RazorDiagnosticSeverity.Error) + .ToString()); + } + + trees.Add(CSharpSyntaxTree.ParseText(targetCode)); + } + + var cSharpCompilation = + CreateCSharpCompilation(multipleRazorOptions.AssemblyName, multipleRazorOptions.OptimizationLevel, + multipleRazorOptions.ConcurrentBuild, trees.ToArray()); + + using MemoryStream ms = new(); + var result = cSharpCompilation.Emit(ms); + if (!result.Success) + throw new Exception(result.Diagnostics.First(v => v.Severity == DiagnosticSeverity.Error).ToString()); + + return ms.ToArray(); + } + + public static CSharpCompilation CreateCSharpCompilation(string assemblyName, OptimizationLevel optimizationLevel, + bool concurrentBuild, params SyntaxTree[] trees) + { + ArgumentNullException.ThrowIfNull(_references); + + return CSharpCompilation.Create(assemblyName) + .WithOptions(new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary, + optimizationLevel: optimizationLevel, + specificDiagnosticOptions: new[] + { + new KeyValuePair("CS1701", ReportDiagnostic.Suppress), + new KeyValuePair("CS1702", ReportDiagnostic.Suppress), + }, + concurrentBuild: concurrentBuild)) // TODO: If it is WebAssembly you need to cancel the concurrency otherwise it will not work + .AddSyntaxTrees(trees) + .AddReferences(_references); + } } \ No newline at end of file From 03363d1dac80019e3ed1bf1d16f59ca0e5197c1c Mon Sep 17 00:00:00 2001 From: token <239573049@qq.com> Date: Sun, 29 Sep 2024 23:49:26 +0800 Subject: [PATCH 3/5] =?UTF-8?q?=E6=9B=B4=E6=96=B0Razor=E7=BC=96=E8=AF=91?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Directory.Build.props | 2 +- .../Masa.Blazor.Extensions.Languages.Razor.csproj | 2 +- .../Options/CompileRazorProjectFileSystem.cs | 4 +++- .../Masa.Blazor.Extensions.Languages.Razor/RazorCompile.cs | 4 ++-- 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/Directory.Build.props b/Directory.Build.props index 311a050..b5e7700 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -1,6 +1,6 @@ - 6.0.13 + 6.0.33 $(AssemblyName) packageIcon.png diff --git a/src/Languages/Masa.Blazor.Extensions.Languages.Razor/Masa.Blazor.Extensions.Languages.Razor.csproj b/src/Languages/Masa.Blazor.Extensions.Languages.Razor/Masa.Blazor.Extensions.Languages.Razor.csproj index e326fda..ca0ab95 100644 --- a/src/Languages/Masa.Blazor.Extensions.Languages.Razor/Masa.Blazor.Extensions.Languages.Razor.csproj +++ b/src/Languages/Masa.Blazor.Extensions.Languages.Razor/Masa.Blazor.Extensions.Languages.Razor.csproj @@ -3,7 +3,7 @@ enable enable - net6.0; + net6.0;net7.0;net8.0; diff --git a/src/Languages/Masa.Blazor.Extensions.Languages.Razor/Options/CompileRazorProjectFileSystem.cs b/src/Languages/Masa.Blazor.Extensions.Languages.Razor/Options/CompileRazorProjectFileSystem.cs index 3fe0e4b..9412962 100644 --- a/src/Languages/Masa.Blazor.Extensions.Languages.Razor/Options/CompileRazorProjectFileSystem.cs +++ b/src/Languages/Masa.Blazor.Extensions.Languages.Razor/Options/CompileRazorProjectFileSystem.cs @@ -6,7 +6,9 @@ public class CompileRazorProjectFileSystem : RazorProjectFileSystem { private static ConcurrentBag _globalUsing = new() { - "@using Microsoft.AspNetCore.Components.Web" + "@using Microsoft.AspNetCore.Components.Web", + "@using Microsoft.AspNetCore.Components", + "@using System", }; public static string GlobalUsing => diff --git a/src/Languages/Masa.Blazor.Extensions.Languages.Razor/RazorCompile.cs b/src/Languages/Masa.Blazor.Extensions.Languages.Razor/RazorCompile.cs index 65e242d..35b9998 100644 --- a/src/Languages/Masa.Blazor.Extensions.Languages.Razor/RazorCompile.cs +++ b/src/Languages/Masa.Blazor.Extensions.Languages.Razor/RazorCompile.cs @@ -21,7 +21,7 @@ public static void Initialized(List? refs, List? refs, List v.Severity == RazorDiagnosticSeverity.Error) > 0) { throw new Exception(cSharpDocument.Diagnostics.First(v => v.Severity == RazorDiagnosticSeverity.Error) .ToString()); From 9bbc812fde5e9ee8820ece8ce4efd622923511b1 Mon Sep 17 00:00:00 2001 From: capdiem Date: Mon, 30 Sep 2024 11:27:44 +0800 Subject: [PATCH 4/5] Update package_push_nuget.org.yml --- .github/workflows/package_push_nuget.org.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/package_push_nuget.org.yml b/.github/workflows/package_push_nuget.org.yml index 7f77130..0eec0a8 100644 --- a/.github/workflows/package_push_nuget.org.yml +++ b/.github/workflows/package_push_nuget.org.yml @@ -18,7 +18,10 @@ jobs: - name: setting dotnet version uses: actions/setup-dotnet@v1 with: - dotnet-version: '6.0.x' + dotnet-version: | + 6.0.x + 7.0.x + 8.0.x include-prerelease: true - name: restore From fe4c66c3cae857a9783d8d413dd4a5e8ba87b258 Mon Sep 17 00:00:00 2001 From: capdiem Date: Mon, 30 Sep 2024 11:28:10 +0800 Subject: [PATCH 5/5] Update pr_run_test_ci.yml --- .github/workflows/pr_run_test_ci.yml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/pr_run_test_ci.yml b/.github/workflows/pr_run_test_ci.yml index f0eb232..e24559c 100644 --- a/.github/workflows/pr_run_test_ci.yml +++ b/.github/workflows/pr_run_test_ci.yml @@ -20,7 +20,10 @@ jobs: - name: setting dotnet version uses: actions/setup-dotnet@v1 with: - dotnet-version: '6.0.x' + dotnet-version: | + 6.0.x + 7.0.x + 8.0.x include-prerelease: true - name: Configure sysctl limits @@ -65,4 +68,4 @@ jobs: run: | dotnet build /p:ContinuousIntegrationBuild=true dotnet test --no-build --verbosity normal --collect "Code Coverage" /p:CollectCoverage=true /p:CoverletOutputFormat=opencover /p:Exclude="[*.Tests]*" - \ No newline at end of file +