From 9f715d4c6ccf6fb7f34296fbb57b722f86ab5937 Mon Sep 17 00:00:00 2001 From: darrelmiller Date: Mon, 20 Jan 2020 16:59:14 -0500 Subject: [PATCH 1/8] Initial implementation of OpenAPI cmdline tool --- Microsoft.OpenApi.sln | 7 +++ .../Microsoft.OpenApi.Tool.csproj | 20 +++++++ src/Microsoft.OpenApi.Tool/OpenApiService.cs | 59 +++++++++++++++++++ src/Microsoft.OpenApi.Tool/Program.cs | 50 ++++++++++++++++ 4 files changed, 136 insertions(+) create mode 100644 src/Microsoft.OpenApi.Tool/Microsoft.OpenApi.Tool.csproj create mode 100644 src/Microsoft.OpenApi.Tool/OpenApiService.cs create mode 100644 src/Microsoft.OpenApi.Tool/Program.cs diff --git a/Microsoft.OpenApi.sln b/Microsoft.OpenApi.sln index c71f28228..e64ff3a24 100644 --- a/Microsoft.OpenApi.sln +++ b/Microsoft.OpenApi.sln @@ -26,6 +26,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{6357D7FD-2 EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.OpenApi.SmokeTests", "test\Microsoft.OpenApi.SmokeTests\Microsoft.OpenApi.SmokeTests.csproj", "{AD79B61D-88CF-497C-9ED5-41AE3867C5AC}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.OpenApi.Tool", "src\Microsoft.OpenApi.Tool\Microsoft.OpenApi.Tool.csproj", "{254841B5-7DAC-4D1D-A9C5-44FE5CE467BE}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -56,6 +58,10 @@ Global {AD79B61D-88CF-497C-9ED5-41AE3867C5AC}.Debug|Any CPU.Build.0 = Debug|Any CPU {AD79B61D-88CF-497C-9ED5-41AE3867C5AC}.Release|Any CPU.ActiveCfg = Release|Any CPU {AD79B61D-88CF-497C-9ED5-41AE3867C5AC}.Release|Any CPU.Build.0 = Release|Any CPU + {254841B5-7DAC-4D1D-A9C5-44FE5CE467BE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {254841B5-7DAC-4D1D-A9C5-44FE5CE467BE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {254841B5-7DAC-4D1D-A9C5-44FE5CE467BE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {254841B5-7DAC-4D1D-A9C5-44FE5CE467BE}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -67,6 +73,7 @@ Global {AD83F991-DBF3-4251-8613-9CC54C826964} = {6357D7FD-2DE4-4900-ADB9-ABC37052040A} {1ED3C2C1-E1E7-4925-B4E6-2D969C3F5237} = {6357D7FD-2DE4-4900-ADB9-ABC37052040A} {AD79B61D-88CF-497C-9ED5-41AE3867C5AC} = {6357D7FD-2DE4-4900-ADB9-ABC37052040A} + {254841B5-7DAC-4D1D-A9C5-44FE5CE467BE} = {E546B92F-20A8-49C3-8323-4B25BB78F3E1} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {9F171EFC-0DB5-4B10-ABFA-AF48D52CC565} diff --git a/src/Microsoft.OpenApi.Tool/Microsoft.OpenApi.Tool.csproj b/src/Microsoft.OpenApi.Tool/Microsoft.OpenApi.Tool.csproj new file mode 100644 index 000000000..5ac8d8e16 --- /dev/null +++ b/src/Microsoft.OpenApi.Tool/Microsoft.OpenApi.Tool.csproj @@ -0,0 +1,20 @@ + + + + Exe + netcoreapp3.1 + true + openapi + ./../../artifacts + + + + + + + + + + + + diff --git a/src/Microsoft.OpenApi.Tool/OpenApiService.cs b/src/Microsoft.OpenApi.Tool/OpenApiService.cs new file mode 100644 index 000000000..0f0c8039f --- /dev/null +++ b/src/Microsoft.OpenApi.Tool/OpenApiService.cs @@ -0,0 +1,59 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using Microsoft.OpenApi.Extensions; +using Microsoft.OpenApi.Readers; +using Microsoft.OpenApi.Validations; +using Microsoft.OpenApi.Writers; + +namespace Microsoft.OpenApi.Tool +{ + static class OpenApiService + { + public static void ProcessOpenApiDocument( + FileInfo fileOption, + string outputPath, + OpenApiSpecVersion version, + OpenApiFormat format, + bool inline = false) + { + Stream stream = fileOption.OpenRead(); + + var document = new OpenApiStreamReader(new OpenApiReaderSettings + { + ReferenceResolution = ReferenceResolutionSetting.ResolveLocalReferences, + RuleSet = ValidationRuleSet.GetDefaultRuleSet() + } + ).Read(stream, out var context); + + if (context.Errors.Count != 0) + { + var errorReport = new StringBuilder(); + + foreach (var error in context.Errors) + { + errorReport.AppendLine(error.ToString()); + } + + throw new ArgumentException(String.Join(Environment.NewLine, context.Errors.Select(e => e.Message).ToArray())); + } + + using (var outputStream = new FileStream(outputPath, FileMode.Create)) + { + document.Serialize( + outputStream, + version, + format, + new OpenApiWriterSettings() + { + ReferenceInline = inline == true ? ReferenceInlineSetting.InlineLocalReferences : ReferenceInlineSetting.DoNotInlineReferences + }); + + outputStream.Position = 0; + outputStream.Flush(); + } + } +} +} diff --git a/src/Microsoft.OpenApi.Tool/Program.cs b/src/Microsoft.OpenApi.Tool/Program.cs new file mode 100644 index 000000000..ce0296b2e --- /dev/null +++ b/src/Microsoft.OpenApi.Tool/Program.cs @@ -0,0 +1,50 @@ +using System; +using System.CommandLine; +using System.CommandLine.Invocation; +using System.IO; +using Microsoft.OpenApi; + +namespace Microsoft.OpenApi.Tool +{ + class Program + { + static int Main(string[] args) + { + var rootCommand = new RootCommand + { + new Option( + "--input", + "Input OpenAPI description") + { + Argument = new Argument() + }, + new Option( + "--output", + "Output path for OpenAPI Description") + { + Argument = new Argument() + }, + new Option( + "--output-version", + "OpenAPI Version") + { + Argument = new Argument(() => OpenApiSpecVersion.OpenApi3_0) + }, + new Option( + "--output-format", + "OpenAPI format [Json | Yaml") + { + Argument = new Argument(() => OpenApiFormat.Yaml ) + } + }; + + rootCommand.Description = "OpenAPI"; + + rootCommand.Handler = CommandHandler.Create( + OpenApiService.ProcessOpenApiDocument); + + // Parse the incoming args and invoke the handler + return rootCommand.InvokeAsync(args).Result; + } + } +} From 6926b6d7bae6c0abed07e96733ac681ba63af96e Mon Sep 17 00:00:00 2001 From: darrelmiller Date: Mon, 20 Jan 2020 23:07:04 -0500 Subject: [PATCH 2/8] First running version of OpenApi tool --- .../Microsoft.OpenApi.Tool.csproj | 1 + src/Microsoft.OpenApi.Tool/OpenApiService.cs | 56 +++++++++++++------ src/Microsoft.OpenApi.Tool/Program.cs | 42 ++++---------- 3 files changed, 51 insertions(+), 48 deletions(-) diff --git a/src/Microsoft.OpenApi.Tool/Microsoft.OpenApi.Tool.csproj b/src/Microsoft.OpenApi.Tool/Microsoft.OpenApi.Tool.csproj index 5ac8d8e16..0fda71fa9 100644 --- a/src/Microsoft.OpenApi.Tool/Microsoft.OpenApi.Tool.csproj +++ b/src/Microsoft.OpenApi.Tool/Microsoft.OpenApi.Tool.csproj @@ -6,6 +6,7 @@ true openapi ./../../artifacts + 0.5.0 diff --git a/src/Microsoft.OpenApi.Tool/OpenApiService.cs b/src/Microsoft.OpenApi.Tool/OpenApiService.cs index 0f0c8039f..7a8e8ced2 100644 --- a/src/Microsoft.OpenApi.Tool/OpenApiService.cs +++ b/src/Microsoft.OpenApi.Tool/OpenApiService.cs @@ -4,6 +4,7 @@ using System.Linq; using System.Text; using Microsoft.OpenApi.Extensions; +using Microsoft.OpenApi.Models; using Microsoft.OpenApi.Readers; using Microsoft.OpenApi.Validations; using Microsoft.OpenApi.Writers; @@ -13,21 +14,22 @@ namespace Microsoft.OpenApi.Tool static class OpenApiService { public static void ProcessOpenApiDocument( - FileInfo fileOption, - string outputPath, + FileInfo input, + FileInfo output, OpenApiSpecVersion version, OpenApiFormat format, - bool inline = false) + bool inline) { - Stream stream = fileOption.OpenRead(); + OpenApiDocument document; + using (Stream stream = input.OpenRead()) + { - var document = new OpenApiStreamReader(new OpenApiReaderSettings + document = new OpenApiStreamReader(new OpenApiReaderSettings { ReferenceResolution = ReferenceResolutionSetting.ResolveLocalReferences, RuleSet = ValidationRuleSet.GetDefaultRuleSet() } ).Read(stream, out var context); - if (context.Errors.Count != 0) { var errorReport = new StringBuilder(); @@ -38,21 +40,41 @@ public static void ProcessOpenApiDocument( } throw new ArgumentException(String.Join(Environment.NewLine, context.Errors.Select(e => e.Message).ToArray())); + } } - using (var outputStream = new FileStream(outputPath, FileMode.Create)) + using (var outputStream = output?.Create()) { - document.Serialize( - outputStream, - version, - format, - new OpenApiWriterSettings() - { - ReferenceInline = inline == true ? ReferenceInlineSetting.InlineLocalReferences : ReferenceInlineSetting.DoNotInlineReferences - }); + TextWriter textWriter; + + if (outputStream!=null) + { + textWriter = new StreamWriter(outputStream); + } else + { + textWriter = Console.Out; + } + + var settings = new OpenApiWriterSettings() + { + ReferenceInline = inline == true ? ReferenceInlineSetting.InlineLocalReferences : ReferenceInlineSetting.DoNotInlineReferences + }; + IOpenApiWriter writer; + switch (format) + { + case OpenApiFormat.Json: + writer = new OpenApiJsonWriter(textWriter, settings); + break; + case OpenApiFormat.Yaml: + writer = new OpenApiYamlWriter(textWriter, settings); + break; + default: + throw new ArgumentException("Unknown format"); + } + + document.Serialize(writer,version ); - outputStream.Position = 0; - outputStream.Flush(); + textWriter.Flush(); } } } diff --git a/src/Microsoft.OpenApi.Tool/Program.cs b/src/Microsoft.OpenApi.Tool/Program.cs index ce0296b2e..3d229c411 100644 --- a/src/Microsoft.OpenApi.Tool/Program.cs +++ b/src/Microsoft.OpenApi.Tool/Program.cs @@ -2,49 +2,29 @@ using System.CommandLine; using System.CommandLine.Invocation; using System.IO; +using System.Threading.Tasks; using Microsoft.OpenApi; namespace Microsoft.OpenApi.Tool { class Program { - static int Main(string[] args) + static async Task Main(string[] args) { - var rootCommand = new RootCommand + var command = new RootCommand { - new Option( - "--input", - "Input OpenAPI description") - { - Argument = new Argument() - }, - new Option( - "--output", - "Output path for OpenAPI Description") - { - Argument = new Argument() - }, - new Option( - "--output-version", - "OpenAPI Version") - { - Argument = new Argument(() => OpenApiSpecVersion.OpenApi3_0) - }, - new Option( - "--output-format", - "OpenAPI format [Json | Yaml") - { - Argument = new Argument(() => OpenApiFormat.Yaml ) - } + new Option("--input") { Argument = new Argument() }, + new Option("--output") { Argument = new Argument() }, + new Option("--version") { Argument = new Argument() }, + new Option("--format") { Argument = new Argument() }, + new Option("--inline") { Argument = new Argument() } }; - rootCommand.Description = "OpenAPI"; - - rootCommand.Handler = CommandHandler.Create( - OpenApiService.ProcessOpenApiDocument); + command.Handler = CommandHandler.Create( + OpenApiService.ProcessOpenApiDocument); // Parse the incoming args and invoke the handler - return rootCommand.InvokeAsync(args).Result; + return await command.InvokeAsync(args); } } } From cf7002a86ac70a33abb8dfb10d15672c84a8d093 Mon Sep 17 00:00:00 2001 From: Darrel Miller Date: Thu, 5 Mar 2020 19:03:47 -0600 Subject: [PATCH 3/8] Fix warnings --- src/Microsoft.OpenApi.Readers/ParsingContext.cs | 9 +++++++-- src/Microsoft.OpenApi/Any/OpenApiString.cs | 1 + .../Extensions/OpenApiSerializableExtensions.cs | 1 + src/Microsoft.OpenApi/Services/LoopDetector.cs | 3 --- .../Services/OpenApiDifferenceOperation.cs | 4 ++++ src/Microsoft.OpenApi/Writers/OpenApiJsonWriter.cs | 1 + test/Microsoft.OpenApi.SmokeTests/ApiGurus.cs | 2 +- 7 files changed, 15 insertions(+), 6 deletions(-) diff --git a/src/Microsoft.OpenApi.Readers/ParsingContext.cs b/src/Microsoft.OpenApi.Readers/ParsingContext.cs index 8cb9f5fd2..9c7277136 100644 --- a/src/Microsoft.OpenApi.Readers/ParsingContext.cs +++ b/src/Microsoft.OpenApi.Readers/ParsingContext.cs @@ -30,8 +30,15 @@ public class ParsingContext internal List Tags { get; private set; } = new List(); internal Uri BaseUrl { get; set; } + /// + /// Diagnostic object that returns metadata about the parsing process. + /// public OpenApiDiagnostic Diagnostic { get; } + /// + /// Create Parsing Context + /// + /// Provide instance for diagnotic object for collecting and accessing information about the parsing. public ParsingContext(OpenApiDiagnostic diagnostic) { Diagnostic = diagnostic; @@ -41,7 +48,6 @@ public ParsingContext(OpenApiDiagnostic diagnostic) /// Initiates the parsing process. Not thread safe and should only be called once on a parsing context /// /// Yaml document to parse. - /// Diagnostic object which will return diagnostic results of the operation. /// An OpenApiDocument populated based on the passed yamlDocument internal OpenApiDocument Parse(YamlDocument yamlDocument) { @@ -77,7 +83,6 @@ internal OpenApiDocument Parse(YamlDocument yamlDocument) /// /// /// OpenAPI version of the fragment - /// Diagnostic object which will return diagnostic results of the operation. /// An OpenApiDocument populated based on the passed yamlDocument internal T ParseFragment(YamlDocument yamlDocument, OpenApiSpecVersion version) where T : IOpenApiElement { diff --git a/src/Microsoft.OpenApi/Any/OpenApiString.cs b/src/Microsoft.OpenApi/Any/OpenApiString.cs index 00bfbe2cd..e1036cfca 100644 --- a/src/Microsoft.OpenApi/Any/OpenApiString.cs +++ b/src/Microsoft.OpenApi/Any/OpenApiString.cs @@ -14,6 +14,7 @@ public class OpenApiString : OpenApiPrimitive /// Initializes the class. /// /// + /// Used to indicate if a string is quoted. public OpenApiString(string value, bool isExplicit = false) : base(value) { diff --git a/src/Microsoft.OpenApi/Extensions/OpenApiSerializableExtensions.cs b/src/Microsoft.OpenApi/Extensions/OpenApiSerializableExtensions.cs index f50f1c5f7..e14c98340 100644 --- a/src/Microsoft.OpenApi/Extensions/OpenApiSerializableExtensions.cs +++ b/src/Microsoft.OpenApi/Extensions/OpenApiSerializableExtensions.cs @@ -50,6 +50,7 @@ public static void SerializeAsYaml(this T element, Stream stream, OpenApiSpec /// The given stream. /// The Open API specification version. /// The output format (JSON or YAML). + /// Provide configuration settings for controlling writing output public static void Serialize( this T element, Stream stream, diff --git a/src/Microsoft.OpenApi/Services/LoopDetector.cs b/src/Microsoft.OpenApi/Services/LoopDetector.cs index 64001b22b..249cab51d 100644 --- a/src/Microsoft.OpenApi/Services/LoopDetector.cs +++ b/src/Microsoft.OpenApi/Services/LoopDetector.cs @@ -13,7 +13,6 @@ internal class LoopDetector /// /// Maintain history of traversals to avoid stack overflows from cycles /// - /// Any unique identifier for a stack. /// Identifier used for current context. /// If method returns false a loop was detected and the key is not added. public bool PushLoop(T key) @@ -39,7 +38,6 @@ public bool PushLoop(T key) /// /// Exit from the context in cycle detection /// - /// Identifier of loop public void PopLoop() { if (_loopStacks[typeof(T)].Count > 0) @@ -65,7 +63,6 @@ public void SaveLoop(T loop) /// /// Reset loop tracking stack /// - /// Identifier of loop to clear internal void ClearLoop() { _loopStacks[typeof(T)].Clear(); diff --git a/src/Microsoft.OpenApi/Services/OpenApiDifferenceOperation.cs b/src/Microsoft.OpenApi/Services/OpenApiDifferenceOperation.cs index 273763839..896c0a4d3 100644 --- a/src/Microsoft.OpenApi/Services/OpenApiDifferenceOperation.cs +++ b/src/Microsoft.OpenApi/Services/OpenApiDifferenceOperation.cs @@ -3,6 +3,8 @@ namespace Microsoft.OpenApi.Services { +#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member + /// /// The open api difference operation. /// @@ -12,4 +14,6 @@ public enum OpenApiDifferenceOperation Remove, Update } +#pragma warning restore CS1591 // Missing XML comment for publicly visible type or member + } diff --git a/src/Microsoft.OpenApi/Writers/OpenApiJsonWriter.cs b/src/Microsoft.OpenApi/Writers/OpenApiJsonWriter.cs index a0ea9de52..e4c3baa3c 100644 --- a/src/Microsoft.OpenApi/Writers/OpenApiJsonWriter.cs +++ b/src/Microsoft.OpenApi/Writers/OpenApiJsonWriter.cs @@ -14,6 +14,7 @@ public class OpenApiJsonWriter : OpenApiWriterBase /// Initializes a new instance of the class. /// /// The text writer. + /// Settings for controlling how the OpenAPI document will be written out. public OpenApiJsonWriter(TextWriter textWriter, OpenApiWriterSettings settings = null) : base(textWriter, settings) { } diff --git a/test/Microsoft.OpenApi.SmokeTests/ApiGurus.cs b/test/Microsoft.OpenApi.SmokeTests/ApiGurus.cs index 79656c865..e424512ac 100644 --- a/test/Microsoft.OpenApi.SmokeTests/ApiGurus.cs +++ b/test/Microsoft.OpenApi.SmokeTests/ApiGurus.cs @@ -71,7 +71,7 @@ JToken GetProp(JToken obj, string prop) } // Disable as some APIs are currently invalid [Theory(DisplayName = "APIs.guru")] - [MemberData(nameof(GetSchemas))] + // [MemberData(nameof(GetSchemas))] public async Task EnsureThatICouldParse(string url) { var response = await _httpClient.GetAsync(url); From fa20804f187074a56b293a9f4a6ec6b66c288193 Mon Sep 17 00:00:00 2001 From: Darrel Miller Date: Fri, 6 Mar 2020 10:50:24 -0600 Subject: [PATCH 4/8] Updated nuget packages --- src/Microsoft.OpenApi.Tool/Microsoft.OpenApi.Tool.csproj | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.OpenApi.Tool/Microsoft.OpenApi.Tool.csproj b/src/Microsoft.OpenApi.Tool/Microsoft.OpenApi.Tool.csproj index 0fda71fa9..f8f1eab1c 100644 --- a/src/Microsoft.OpenApi.Tool/Microsoft.OpenApi.Tool.csproj +++ b/src/Microsoft.OpenApi.Tool/Microsoft.OpenApi.Tool.csproj @@ -10,7 +10,7 @@ - + @@ -18,4 +18,8 @@ + + + + From 92f2fe4eba07bd636ed2210cf0eb2b01c10681aa Mon Sep 17 00:00:00 2001 From: Darrel Miller Date: Fri, 6 Mar 2020 11:40:43 -0600 Subject: [PATCH 5/8] touch --- build.cmd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.cmd b/build.cmd index 33f1be296..94f3ea8fc 100644 --- a/build.cmd +++ b/build.cmd @@ -1,5 +1,5 @@ @echo off -Echo Building Microsoft.OpenApi +Echo Building Microsoft.OpenApi SET PROJ=%~dp0src\Microsoft.OpenApi\Microsoft.OpenApi.csproj dotnet build %PROJ% /t:restore /p:Configuration=Release From 03b103496c4d18532df5db6c4617bcd3d2f75429 Mon Sep 17 00:00:00 2001 From: Darrel Miller Date: Fri, 6 Mar 2020 11:46:05 -0600 Subject: [PATCH 6/8] Moved commandline tool to .net core 3.0 --- src/Microsoft.OpenApi.Tool/Microsoft.OpenApi.Tool.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.OpenApi.Tool/Microsoft.OpenApi.Tool.csproj b/src/Microsoft.OpenApi.Tool/Microsoft.OpenApi.Tool.csproj index f8f1eab1c..aa22d5fd3 100644 --- a/src/Microsoft.OpenApi.Tool/Microsoft.OpenApi.Tool.csproj +++ b/src/Microsoft.OpenApi.Tool/Microsoft.OpenApi.Tool.csproj @@ -2,7 +2,7 @@ Exe - netcoreapp3.1 + netcoreapp3.0 true openapi ./../../artifacts From 842be3b173d98badaa130b5c64e815fa5611543d Mon Sep 17 00:00:00 2001 From: Darrel Miller Date: Fri, 6 Mar 2020 11:47:49 -0600 Subject: [PATCH 7/8] Moved commandline tool to .net core 2.2 --- src/Microsoft.OpenApi.Tool/Microsoft.OpenApi.Tool.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.OpenApi.Tool/Microsoft.OpenApi.Tool.csproj b/src/Microsoft.OpenApi.Tool/Microsoft.OpenApi.Tool.csproj index aa22d5fd3..5d6f12463 100644 --- a/src/Microsoft.OpenApi.Tool/Microsoft.OpenApi.Tool.csproj +++ b/src/Microsoft.OpenApi.Tool/Microsoft.OpenApi.Tool.csproj @@ -2,7 +2,7 @@ Exe - netcoreapp3.0 + netcoreapp2.2 true openapi ./../../artifacts From 821524974320f27a865e9ad832694b379c27845c Mon Sep 17 00:00:00 2001 From: Darrel Miller Date: Fri, 6 Mar 2020 17:19:46 -0600 Subject: [PATCH 8/8] Put commandline tool back to 3.1 now that pipeline has new Nuget --- src/Microsoft.OpenApi.Tool/Microsoft.OpenApi.Tool.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.OpenApi.Tool/Microsoft.OpenApi.Tool.csproj b/src/Microsoft.OpenApi.Tool/Microsoft.OpenApi.Tool.csproj index 5d6f12463..f8f1eab1c 100644 --- a/src/Microsoft.OpenApi.Tool/Microsoft.OpenApi.Tool.csproj +++ b/src/Microsoft.OpenApi.Tool/Microsoft.OpenApi.Tool.csproj @@ -2,7 +2,7 @@ Exe - netcoreapp2.2 + netcoreapp3.1 true openapi ./../../artifacts