Generare swagger.json来自构建期间的注释

时间:2018-05-01 20:08:42

标签: sbt swagger

我有一个使用Swagger Akka HTTP的Scala应用程序在我的项目中生成swagger.json。它有效,但我有一些问题:

  • 它使用运行时反射,据我所知,我的项目中唯一依赖它的地方
  • 因此,它阻止我使用GraalVM的原生图像(当我运行本机图像时它只是打破了)
  • 它引入了许多其他地方没有使用的依赖项(例如Jackson序列化 - 我使用Circe和Jaws来处理JSON)

我正在寻找一种在构建期间生成swagger.json文件的方法,例如:作为我更新路线时可以运行的SBT任务。

我已经看过sbt-swagger但它已经更新了2年,所以我不会在sbt 1上运行。+。

是否有一些我错过的脚本,要点或文档?理想情况下,我希望能够为Swagger注释处理器提供包前缀,让它扫描类文件并将文件输出到指定位置。

1 个答案:

答案 0 :(得分:1)

由于缺少更好的选择,我写了自己的sbt:sbt-swagger-2

您将其添加到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)),
  ...
)

这并不完美,但总比没有好。

其他值得考虑的是endpoints之类的框架或swagger.json中的generatinh Akka HTTP(但是您必须手动维护此文件)。