RicoSuter / NSwag

The Swagger/OpenAPI toolchain for .NET, ASP.NET Core and TypeScript.
http://NSwag.org
MIT License
6.62k stars 1.23k forks source link

The schema reference path has not been resolved. #3907

Open capiev80 opened 2 years ago

capiev80 commented 2 years ago

Either I'm doing something wrong or something doesn't work correctly: as soon as the internal second link for aggregation appears in the secondary file, the generator stops finding it. That is, in this case, the generator does not find "./test.components.yaml#/components/schemas/SomeAdditionalData2"

test.openapi.yaml

openapi:  3.0.0
info:
  title: Test API
  version: 1.0.0

paths:
  /get-values/:
    get:
      tags:
        - Test
      operationId: GetValues
      responses:
        200:
          content:
            'application/*+json':
              schema:
                $ref: './test.components.yaml#/components/schemas/SomeResponse'

test.components.yaml

openapi:  3.0.0
components:
  schemas:
    SomeResponse:
      type: object
      properties:
        someField:
          $ref: './test.components.yaml#/components/schemas/SomeAdditionalData'
        accessToken:
          type: string      
    SomeAdditionalData:
      type: object
      properties: 
        someValue:
          $ref: './test.components.yaml#/components/schemas/SomeAdditionalData2'        
    SomeAdditionalData2:
      type: object
      properties:
        someValue:
          type: string

test.build.sh

~/.dotnet/dotnet ~/.nuget/packages/nswag.msbuild/13.15.10/tools/Net60/dotnet-nswag.dll openapi2cscontroller /input:test.openapi.yaml /namespace:Main.Controllers.v1.api /output:Controllers/TestBaseControllers.cs /UseLiquidTemplates:false /AspNetNamespace:"Microsoft.AspNetCore.Mvc" /ControllerBaseClass:"Microsoft.AspNetCore.Mvc.Controller" /GenerateOptionalPropertiesAsNullable:True /OperationGenerationMode:MultipleClientsFromFirstTagAndOperationId /BasePath:/api/v1/ /RouteNamingStrategy:operationid /ControllerStyle:abstract /classname:'{controller}' /useActionResultType:true /wrapResponses:false /GenerateResponseClasses:false /ResponseClass:"SwaggerResponse" /classStyle:poco  /dateType:System.DateTime /dateTimeType:System.DateTime /additionalNamespaceUsages:Microsoft.AspNetCore.Mvc /enforceFlagEnums:false /generateJsonMethods:true

output

NSwag command line tool for .NET Core Net60, toolchain v13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))
Visit http://NSwag.org for more information.
NSwag bin directory: /Users/capiev/.nuget/packages/nswag.msbuild/13.15.10/tools/Net60
System.InvalidOperationException: Error while rendering Liquid template CSharp/Class: 
The schema reference path './test.components.yaml#/components/schemas/SomeAdditionalData2' has not been resolved.
 ---> System.InvalidOperationException: The schema reference path './test.components.yaml#/components/schemas/SomeAdditionalData2' has not been resolved.
   at NJsonSchema.JsonSchema.<GetActualSchema>g__ThrowInvalidOperationException|265_0(String message)
   at NJsonSchema.JsonSchema.get_ActualSchema()
   at NJsonSchema.JsonSchema.IsNullable(SchemaType schemaType)
   at NJsonSchema.JsonSchemaProperty.IsNullable(SchemaType schemaType)
   at NJsonSchema.CodeGeneration.CSharp.Models.PropertyModel.get_JsonPropertyRequiredCode()
   at Fluid.Accessors.PropertyInfoAccessor.Invoker`2.Invoke(Object target)
   at Fluid.Accessors.PropertyInfoAccessor.Get(Object obj, String name, TemplateContext ctx)
   at Fluid.Values.ObjectValueBase.GetValueAsync(String name, TemplateContext context)
   at Fluid.Ast.IdentifierSegment.ResolveAsync(FluidValue value, TemplateContext context)
   at Fluid.Ast.MemberExpression.EvaluateAsync(TemplateContext context)
   at Fluid.Ast.OutputStatement.WriteToAsync(TextWriter writer, TextEncoder encoder, TemplateContext context)
   at Fluid.Ast.ElseStatement.WriteToAsync(TextWriter writer, TextEncoder encoder, TemplateContext context)
   at Fluid.Ast.IfStatement.WriteToAsync(TextWriter writer, TextEncoder encoder, TemplateContext context)
   at Fluid.Ast.ForStatement.WriteToAsync(TextWriter writer, TextEncoder encoder, TemplateContext context)
   at Fluid.Parser.FluidTemplate.Awaited(ValueTask`1 task, TextWriter writer, TextEncoder encoder, TemplateContext context, IReadOnlyList`1 statements, Int32 startIndex)
   at Fluid.FluidTemplateExtensions.RenderAsync(IFluidTemplate template, TemplateContext context, TextEncoder encoder)
   at NJsonSchema.CodeGeneration.DefaultTemplateFactory.LiquidTemplate.Render()
   --- End of inner exception stack trace ---
   at NJsonSchema.CodeGeneration.DefaultTemplateFactory.LiquidTemplate.Render()
   at NJsonSchema.CodeGeneration.CodeArtifact..ctor(String typeName, String baseTypeName, CodeArtifactType type, CodeArtifactLanguage language, CodeArtifactCategory category, ITemplate template)
   at NJsonSchema.CodeGeneration.CSharp.CSharpGenerator.GenerateClass(JsonSchema schema, String typeName)
   at NJsonSchema.CodeGeneration.CSharp.CSharpGenerator.GenerateType(JsonSchema schema, String typeNameHint)
   at NJsonSchema.CodeGeneration.GeneratorBase.GenerateTypes()
   at NJsonSchema.CodeGeneration.CSharp.CSharpGenerator.GenerateTypes()
   at NSwag.CodeGeneration.CSharp.CSharpGeneratorBase.GenerateDtoTypes() in /_/src/NSwag.CodeGeneration.CSharp/CSharpGeneratorBase.cs:line 106
   at NSwag.CodeGeneration.ClientGeneratorBase`3.GenerateFile(ClientGeneratorOutputType outputType) in /_/src/NSwag.CodeGeneration/ClientGeneratorBase.cs:line 75
   at NSwag.CodeGeneration.ClientGeneratorBase`3.GenerateFile() in /_/src/NSwag.CodeGeneration/ClientGeneratorBase.cs:line 65
   at NSwag.Commands.CodeGeneration.SwaggerToCSharpControllerCommand.RunAsync() in /_/src/NSwag.Commands/Commands/CodeGeneration/OpenApiToCSharpControllerCommand.cs:line 99
   at NSwag.Commands.CodeGeneration.SwaggerToCSharpControllerCommand.RunAsync(CommandLineProcessor processor, IConsoleHost host) in /_/src/NSwag.Commands/Commands/CodeGeneration/OpenApiToCSharpControllerCommand.cs:line 90
   at NConsole.CommandLineProcessor.ProcessSingleAsync(String[] args, Object input)
   at NConsole.CommandLineProcessor.ProcessAsync(String[] args, Object input)
   at NSwag.Commands.NSwagCommandProcessor.ProcessAsync(String[] args) in /_/src/NSwag.Commands/NSwagCommandProcessor.cs:line 61%   
xamele0n commented 1 week ago

see https://github.com/RicoSuter/NSwag/issues/3175#issuecomment-2205662205