Проблема с автоматической генерацией 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 шт):
Решение оказалось удивительно простым.
Я начал смотреть, за что отвечает каждый из параметров в разделе aspNetCoreToOpenApi.
Обратил внимание на параметр noBuild и решил для теста изменить его значение:
"noBuild": true,
После внесения этой корректировки все заработало.
Я обратил внимание на этот параметр только сегодня, думаю, вчера я просто устал и не заметил этого)