.NET 8不兼容Swagger CLI,如何在构建后生成Swagger文件?
在.NET 8项目中绕开Swagger CLI兼容问题生成OpenAPI规范文件
针对Swagger CLI(swashbuckle.aspnetcore.cli v6.5.0)不兼容.NET 8的问题,给你几个不用CLI也能在构建后生成Swagger文件的办法:
方案1:修改编程生成路径到构建输出目录
你之前的代码是写入当前目录,流水线构建时这个目录大概率没有写入权限,改成写入构建输出目录(比如bin/Debug/net8.0)就行,流水线一般会把这个目录的文件作为工件收集。
修改你的辅助方法:
internal static void SaveSwaggerJson(this IServiceProvider provider) { var swaggerService = provider.GetRequiredService<ISwaggerProvider>(); var doc = swaggerService.GetSwagger("v1", null, "/"); var swaggerFile = doc.SerializeAsJson(Microsoft.OpenApi.OpenApiSpecVersion.OpenApi3_0); // 输出到应用程序基目录(也就是构建输出目录) var outputPath = Path.Combine(AppContext.BaseDirectory, "swagger_v1.json"); File.WriteAllText(outputPath, swaggerFile); }
然后在Program.cs里加个环境判断,只在构建或开发环境执行,避免生产环境跑的时候生成文件:
if (builder.Environment.IsDevelopment() || builder.Environment.IsEnvironment("Build")) { app.Services.SaveSwaggerJson(); }
流水线构建时,设置环境变量ASPNETCORE_ENVIRONMENT=Build,启动应用就会把文件生成到输出目录,之后流水线直接收集这个目录的文件就行。
方案2:做个独立控制台项目生成Swagger文件
不用启动Web应用,直接在构建阶段跑个控制台程序生成文件,权限问题也能避免,还更灵活。
- 新建一个.NET 8控制台项目,引用你的Web项目。
- 在控制台项目的
Program.cs里初始化Swagger服务并生成文件(复制Web项目里的Swagger配置,保持一致):
using Microsoft.Extensions.DependencyInjection; using Microsoft.OpenApi; using Swashbuckle.AspNetCore.SwaggerGen; using YourWebProjectNamespace; // 替换成你的Web项目命名空间 var services = new ServiceCollection(); // 复制Web项目中AddSwaggerGen的所有配置 services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new() { Title = "你的API名称", Version = "v1" }); // 比如添加注释文件、安全定义这些,和Web项目一模一样 }); // 添加Web项目必要的服务(比如控制器发现) services.AddControllers(); var provider = services.BuildServiceProvider(); var swaggerGenerator = provider.GetRequiredService<ISwaggerGenerator>(); var doc = swaggerGenerator.GenerateSwagger("v1", null, "/"); // 可以通过命令行参数指定输出路径(方便流水线传递工件目录) var outputPath = args.Length > 0 ? args[0] : Path.Combine(Directory.GetCurrentDirectory(), "swagger_v1.json"); File.WriteAllText(outputPath, doc.SerializeAsJson(OpenApiSpecVersion.OpenApi3_0));
- 在Web项目的构建后事件里加命令,让控制台程序生成文件到流水线工件目录:
dotnet run --project ../YourConsoleProjectName/YourConsoleProjectName.csproj "$(Build.ArtifactStagingDirectory)"
把YourConsoleProjectName替换成你的控制台项目名称,这样构建完成后,文件直接生成到流水线的工件暂存目录,能被自动收集。
方案3:升级Swashbuckle.AspNetCore.CLI到兼容版本
其实v6.5.0之后的Swashbuckle CLI版本(比如v7.x)已经支持.NET 8了,你可以升级包版本,然后直接用CLI命令在构建后事件生成文件:
dotnet swagger tofile --output $(Build.ArtifactStagingDirectory)/swagger_v1.json $(OutputPath)/YourWebProject.dll v1
把YourWebProject.dll替换成你的Web项目输出的DLL文件名就行。
内容的提问来源于stack exchange,提问作者Shashank Shukla
相关产品推荐
相关产品推荐

