如何在Azure DevOps管道中不启动API提取Swagger.json
不启动ASP.NET Core API提取Swagger.json的解决方案
你在Azure DevOps Pipeline中构建ASP.NET Core Web API后,尝试用dotnet swagger tofile提取swagger.json,但命令会尝试启动API,因缺少数据库配置等依赖失败。下面提供两种可行的解决方法:
方法一:修改API项目代码,支持离线生成Swagger.json
这种方法通过在项目中添加判断逻辑,让程序在特定环境变量下直接生成swagger.json,无需启动完整API服务:
- 在API项目的
Program.cs中修改代码,分离swagger配置与业务服务注册:
var builder = WebApplication.CreateBuilder(args); // 仅注册Swagger相关服务,这部分不依赖数据库等业务组件 builder.Services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = "My API", Version = "v1" }); // 保留你的swagger注释、过滤器等配置 }); // 判断是否处于Swagger生成模式,通过环境变量控制 bool isGeneratingSwagger = Environment.GetEnvironmentVariable("GENERATE_SWAGGER") == "true"; if (!isGeneratingSwagger) { // 仅在非生成模式下注册数据库、业务服务等依赖 builder.Services.AddDbContext<MyDbContext>(options => options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection"))); // 其他业务服务注册代码 } var app = builder.Build(); if (isGeneratingSwagger) { // 生成Swagger文档并写入文件 using var scope = app.Services.CreateScope(); var swaggerGenerator = scope.ServiceProvider.GetRequiredService<ISwaggerProvider>(); var swaggerDoc = swaggerGenerator.GetSwagger("v1"); var jsonOutputPath = Path.Combine(Directory.GetCurrentDirectory(), "swagger.json"); var json = System.Text.Json.JsonSerializer.Serialize(swaggerDoc, new System.Text.Json.JsonSerializerOptions { WriteIndented = true }); File.WriteAllText(jsonOutputPath, json); // 直接退出程序,无需启动API return; } // 正常启动API的中间件配置 app.UseSwagger(); app.UseSwaggerUI(); app.Run();
- 在Azure DevOps Pipeline中替换原有命令,设置环境变量并运行项目:
cd $(System.DefaultWorkingDirectory)/src/Api/bin/Release/net8.0/ # 设置生成Swagger的环境变量 export GENERATE_SWAGGER=true # 运行项目,此时会直接生成swagger.json并退出 dotnet myApi.dll # 将生成的文件复制到Artifact目录 cp swagger.json $(Build.ArtifactStagingDirectory)/swagger.json
方法二:使用Swashbuckle.AspNetCore.Cli的离线生成参数
如果不想修改项目代码,可以尝试使用Swashbuckle CLI的--skip-api-startup参数(需确保Swashbuckle.AspNetCore.Cli版本足够新):
cd $(System.DefaultWorkingDirectory)/src/Api/bin/Release/net8.0/ ASPNETCORE_ENVIRONMENT=Local dotnet swagger tofile --skip-api-startup --output $(Build.ArtifactStagingDirectory)/swagger.json myApi.dll v1
注意:此参数仅适用于较新版本的Swashbuckle.AspNetCore.Cli,若无法使用,优先选择方法一。
内容的提问来源于stack exchange,提问作者dna
相关产品推荐
相关产品推荐

