Проблема с автоматической генерацией TypeScript-кода по OpenAPI в ASP.NET с NSwag и MSBuild

Я изучаю возможность автоматической генерации клиентского кода на TypeScript по OpenAPI моего сервера ASP.NET. Для этого я установил пакет NSwag.AspNetCore из NuGet и обновил файл Program.cs, добавив следующие строки:

builder.Services.AddOpenApiDocument();
app.UseOpenApi();
app.UseSwaggerUI();

Успешно получив ссылку на OpenAPI с помощью Swagger UI, я использовал её в программе NSwag Studio для генерации TypeScript-кода, который можно использовать на клиентской стороне.

Теперь мне хотелось бы автоматизировать этот процесс. В основном, я пытался понять, как настроить автоматическую кодогенерацию после каждой сборки, используя MSBuil, по гайду в документации NSwag на их GitHub-репозитории (https://github.com/RicoSuter/NSwag/wiki/NSwag.MSBuild).

Мой проект ASP.NET разбит на несколько библиотек классов:

Bets.WebUI: ASP.NET проект с контроллерами и другими компонентами Contracts: библиотека классов с DTO Application: содержит классы, обрабатывающие запросы пользователя (бизнес-логика) и другие

Для начала я установил пакет NSwag.MSBuild и сгенерировал файл nswag.json с помощью NSwag Studio. Этот файл содержит следующие настройки:

{
  "runtime": "Net70",
  "defaultVariables": null,
  "documentGenerator": {
    "aspNetCoreToOpenApi": {
      "project": "Bets.WebUI.csproj",
      "documentName": "v1",
      "msBuildProjectExtensionsPath": null,
      "configuration": null,
      "runtime": null,
      "targetFramework": null,
      "noBuild": false,
      "msBuildOutputPath": null,
      "verbose": true,
      "workingDirectory": null,
      "aspNetCoreEnvironment": null,
      "output": null,
      "newLineBehavior": "Auto"
    }
  },
  "codeGenerators": {
    "openApiToTypeScriptClient": {
      "className": "{controller}Client",
      "moduleName": "",
      "namespace": "",
      "typeScriptVersion": 4.3,
      "template": "Angular",
      "promiseType": "Promise",
      "httpClass": "HttpClient",
      "withCredentials": false,
      "useSingletonProvider": true,
      "injectionTokenType": "InjectionToken",
      "rxJsVersion": 7.0,
      "dateTimeType": "Date",
      "nullValue": "Undefined",
      "generateClientClasses": false,
      "generateClientInterfaces": false,
      "generateOptionalParameters": false,
      "exportTypes": true,
      "wrapDtoExceptions": false,
      "exceptionClass": "ApiException",
      "clientBaseClass": null,
      "wrapResponses": false,
      "wrapResponseMethods": [],
      "generateResponseClasses": true,
      "responseClass": "SwaggerResponse",
      "protectedMethods": [],
      "configurationClass": null,
      "useTransformOptionsMethod": false,
      "useTransformResultMethod": false,
      "generateDtoTypes": true,
      "operationGenerationMode": "MultipleClientsFromOperationId",
      "markOptionalProperties": false,
      "generateCloneMethod": false,
      "typeStyle": "Interface",
      "enumStyle": "Enum",
      "useLeafType": false,
      "classTypes": [],
      "extendedClasses": [],
      "extensionCode": null,
      "generateDefaultValues": true,
      "excludedTypeNames": [],
      "excludedParameterNames": [],
      "handleReferences": false,
      "generateTypeCheckFunctions": false,
      "generateConstructorInterface": true,
      "convertConstructorInterfaceData": false,
      "importRequiredTypes": true,
      "useGetBaseUrlMethod": false,
      "baseUrlTokenName": "API_BASE_URL",
      "queryNullValue": "",
      "useAbortSignal": false,
      "inlineNamedDictionaries": true,
      "inlineNamedAny": true,
      "includeHttpContext": true,
      "templateDirectory": null,
      "serviceHost": null,
      "serviceSchemes": null,
      "output": "test.ts",
      "newLineBehavior": "Auto"
    }
  }
}

Затем я добавил следующие строки в файл Bets.WebUI.csproj, согласно инструкции:

<Target Name="NSwag" AfterTargets="Build">
    <Exec Command="$(NSwagExe_Net70) run nswag.json /variables:Configuration=$(Configuration)" />
</Target>

Однако, при сборке проекта процесс зависает после вывода этих сообщений:

13>NSwag command line tool for .NET Core Net70, toolchain v14.0.3.0 (NJsonSchema v11.0.0.0 (Newtonsoft.Json v13.0.0.0))
13>Visit http://NSwag.org for more information.
13>NSwag bin directory: C:\Users\famou\.nuget\packages\nswag.msbuild\14.0.3\tools\Net70
13>
13>Executing file 'nswag.json' with variables 'Configuration=Debug'...

И дальше ничего.

Перед тем как задать вопрос тут я изучил множество гайдов на эту тему. Но ничего мне не помогает. Всюду статьи, где используются старые версии .NET и NSwag. Откатывать версию не вариант, хотелось бы разобраться с актуальными.

Также посмотрел видео NSwag - SWAGGER For ASP.NET CORE and AUTOMATIC Type Generation For TypeScript | (https://www.youtube.com/watch?v=3UlCaK9iJaI). Там автор предлагает такой вариант настройки aspNetCoreToOpenApi:

"aspNetCoreToOpenApi": {
  "project": null,
  "documentName": "v1",
  "msBuildProjectExtensionsPath": null,
  "configuration": null,
  "runtime": null,
  "targetFramework": null,
  "noBuild": false,
  "msBuildOutputPath": null,
  "verbose": true,
  "workingDirectory": null,
  "aspNetCoreEnvironment": null,
  "output": null,
  "newLineBehavior": "Auto",
  "assemblyPaths": [
    "bin/Debug/net7.0/Bets.WebUI.dll"
  ],
  "assemblyConfig": null,
  "referencePaths": [],
  "useNuGetCache": false
}

Я его тоже попробовал, но при сборке nswag просто удаляет эти строки и возвращает ошибку о том, что не указан путь до проекта.


Ответы (1 шт):

Автор решения: Famouse

Решение оказалось удивительно простым.

Я начал смотреть, за что отвечает каждый из параметров в разделе aspNetCoreToOpenApi.

Обратил внимание на параметр noBuild и решил для теста изменить его значение:

"noBuild": true,

После внесения этой корректировки все заработало.

Я обратил внимание на этот параметр только сегодня, думаю, вчера я просто устал и не заметил этого)

→ Ссылка