运行 dotnet swagger tofile 命令会导致解决方案开始运行

问题描述 投票:0回答:1

我正在运行一个解决方案,并将以下内容添加到 csproj 以构建自定义 swagger 文档

`

</PropertyGroup>
<Exec Command="dotnet tool restore" />
<Exec Command="dotnet swagger tofile --output myoutputfile myawesomecode.dll v1 " />

`

当我尝试运行构建时,工具恢复成功,但是解决方案开始运行而不是编写文档。这是一个问题,因为我的服务需要其他几个服务(例如许可)才能运行。

在我的公司,我们有另一个项目没有遇到这个问题,并且似乎没有额外的代码来阻止它运行。

我的问题是如何在不运行源代码的情况下创建 swagger 文档?

.net-core swagger documentation-generation
1个回答
0
投票

经过 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 类,如下所示:

screen shot from documentation from Microsoft

但是 swagger 文档没有提到没有 Startup.cs 会导致任何问题。

© www.soinside.com 2019 - 2024. All rights reserved.