Generare swagger.json из аннотаций во время сборки - PullRequest
0 голосов
/ 01 мая 2018

У меня есть приложение Scala, которое использует Swagger Akka HTTP для генерации swagger.json в моем проекте. Это работает, однако у меня есть некоторые проблемы с этим:

  • он использует отражение во время выполнения, насколько я могу судить, единственное место в моем проекте, которое полагается на него
  • в результате это одна из вещей, которая мешает мне использовать нативный образ GraalVM (когда я запускаю нативный образ, он просто ломается)
  • он вводит много зависимостей, которые больше нигде не используются (например, сериализация Джексона - я использую Circe и Jaws для обработки JSON)

Я ищу способ создания файла swagger.json во время сборки, например, как задача SBT, которую я могу запустить при обновлении маршрутов.

Я уже видел sbt-swagger , но он не обновлялся в течение 2 лет, поэтому я не буду работать на sbt 1. +.

Есть ли какие-то сценарии, списки или документы, которые я пропустил? В идеале я хочу, чтобы у процессора обработки аннотаций Swagger был префикс пакета, чтобы он сканировал файлы классов и выходной файл в указанное место.

1 Ответ

0 голосов
/ 28 августа 2018

Из-за отсутствия лучшего варианта я написал свой собственный 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)),
  ...
)

Это не идеально, но лучше, чем ничего.

Другими вещами, которые стоит рассмотреть, являются фреймворки, такие как конечные точки или генерирование Akka HTTP из swagger.json (но тогда вам придется поддерживать этот файл вручную).

...