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

如何在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服务:

  1. 在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();
  1. 在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 03:33:16