我正在运行一个解决方案,并将以下内容添加到 csproj 以构建自定义 swagger 文档
`
</PropertyGroup>
<Exec Command="dotnet tool restore" />
<Exec Command="dotnet swagger tofile --output myoutputfile myawesomecode.dll v1 " />
`
当我尝试运行构建时,工具恢复成功,但是解决方案开始运行而不是编写文档。这是一个问题,因为我的服务需要其他几个服务(例如许可)才能运行。
在我的公司,我们有另一个项目没有遇到这个问题,并且似乎没有额外的代码来阻止它运行。
我的问题是如何在不运行源代码的情况下创建 swagger 文档?
经过 4 天的搜索,我发现了我的代码库的问题,这要归功于 github 存储库上的开放票证。
https://github.com/domaindrivendev/Swashbuckle.AspNetCore/issues/2290
这解释了已经实施的 swashbuckle CLI 和最小托管模型存在一个未解决的问题。
我的 Program.cs 最初看起来像这样:
public class Program
{
public static async Task Main()
{
var builder = WebApplication.CreateBuilder(args);
builder.Service.AddSingleton<ISomeOtherService, SomeOtherService>();
builder.Services.AddSwaggerGen(options =>
//custom swagger gen
);
builder.Services.AddMvc();
//etc
var app = builder.Build();
if (env.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
await app.RunAsync();
}
}
问题在于
dotnet swagger tofile
代码正在使用反射或其他进程寻找名为“Startup.cs”的类,以便能够加载 swagger 文档。
当 Startup.cs 不存在时,dotnet swagger
运行程序 main。为了确认这一点,我使用名为 Startup.cs 的类(成功运行)运行了代码两次,第二次名为 SomethingElse.cs(启动了我的应用程序)。
为了解决这个问题,我必须引入一个类,它必须从 Startup 开始,如下所示:
public class Startup(IConfiguration configuration, IWebHostEnvironment enviroment)
{
public IConfiguration Configuration { get; } = configuration;
public IWebHostEnvironment Environment { get; } = enviroment;
public void ConfigureServices(IServiceCollection services)
{
service.AddSingleton<ISomeOtherService, SomeOtherService>();
services.AddSwaggerGen(options =>
//custom swagger gen
);
services.AddMvc();
//etc
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
}
}
public class Program
{
public static async Task Main()
{
var builder = WebApplication.CreateBuilder(args);
var startup = new Startup(builder.Configuration, builder.Environment);
startup.ConfigureServices(builder.Services);
var app = builder.Build();
startup.Configure(app, builder.Environment);
await app.RunAsync();
}
}
在最小托管模型的官方文档上,代码示例引用了 Startup.cs 类,如下所示:
但是 swagger 文档没有提到没有 Startup.cs 会导致任何问题。