Sbt 在构建期间从注释中获取Generare swagger.json

Sbt 在构建期间从注释中获取Generare swagger.json,sbt,swagger,Sbt,Swagger,我有一个Scala应用程序,用于在项目中生成swagger.json。它可以工作,但我有一些问题: 据我所知,它使用运行时反射,这是我的项目中唯一依赖它的地方 因此,这是阻止我使用GraalVM的本机映像的原因之一(当我运行本机映像时,它会崩溃) 它引入了许多其他地方不使用的依赖项(例如Jackson序列化-我使用Circe和Jaws来处理JSON) 我正在寻找一种在构建期间生成swagger.json文件的方法,例如,作为一个SBT任务,我可以在更新路由时运行该任务 我已经看到了,但是已经

我有一个Scala应用程序,用于在项目中生成swagger.json。它可以工作,但我有一些问题:

  • 据我所知,它使用运行时反射,这是我的项目中唯一依赖它的地方
  • 因此,这是阻止我使用GraalVM的本机映像的原因之一(当我运行本机映像时,它会崩溃)
  • 它引入了许多其他地方不使用的依赖项(例如Jackson序列化-我使用Circe和Jaws来处理JSON)
我正在寻找一种在构建期间生成swagger.json文件的方法,例如,作为一个SBT任务,我可以在更新路由时运行该任务

我已经看到了,但是已经有2年没有更新了,所以我不会在SBT1上运行


是否有一些脚本、GIST或文档我遗漏了?理想情况下,我希望能够为Swagger annotation processor提供一个包前缀,让它扫描类文件并将文件输出到指定位置。

由于缺少更好的选项,我编写了自己的sbt:

您可以将其添加到
plugins.sbt

addSbtPlugin("io.scalaland" % "sbt-swagger-2" % sbtSwagger2Version)
然后定义如何生成每个
swagger.json
文件

// API v1
swaggerOutputs += Swagger.Output(
  inputFilter = clazz => Set(
    "backend.healthcheck",
    "backend.auth",
    "backend.api.v1"
  ).exists(prefix => clazz.getName.startsWith(prefix)),
  output = (Compile / classDirectory).value / "docs" / "v1" / "swagger.json",
  host = "http://localhost",
  schemes = List(Swagger.Scheme.HTTP, Swagger.Scheme.HTTPS),
  securitySchemeDefinitions = Map("token" -> new Swagger.OAuth2Definition().password("/auth")),
  info = Swagger.Info(
    title = "Backend API v1",
    version = version.value,
    description = """V1 API description""".stripMargin
  )
)

// API v2
swaggerOutputs += Swagger.Output(
  inputFilter = clazz => Set(
    "backend.healthcheck",
    "backend.auth",
    "backend.api.v2"
  ).exists(prefix => clazz.getName.startsWith(prefix)),
  ...
)
这并不完美,但总比没有好


其他值得考虑的是类似于或从
swagger.json
生成Akka HTTP的框架(但随后您必须手动维护此文件)。

您找到解决方案了吗?我构建了自己的插件,以防有人发现这个答案:我停止使用swagger插件,因为我发现swagger核心库的使用非常糟糕。我转而使用Endpoint4s或Tapir库来描述我的端点,然后将它们解释为我需要的任何服务器,同时还从中生成
swagger.json
。虽然它确实需要我重写大量代码,但它很快就得到了回报,因为它使我更容易测试端点,记录它们,并避免了我在使用ADT时经常遇到的Swagger核心库的许多错误。