You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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应用,直接在构建阶段跑个控制台程序生成文件,权限问题也能避免,还更灵活。

  1. 新建一个.NET 8控制台项目,引用你的Web项目。
  2. 在控制台项目的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));
  1. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 09:53:10