Использование плагина sbt Avrohugger в Gradle - PullRequest
0 голосов
/ 02 сентября 2018

Я использую плагин https://github.com/julianpeeters/avrohugger sbt для генерации классов дел Scala для файлов Avro .avsc. Как я могу использовать тот же плагин в проекте Gradle?

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

Я создал плагин gradle для генерации классов дел Scala из схемы Avro, и он внутренне использует библиотеку avrohugger.

Так что теперь достаточно добавить этот плагин в ваш проект:

plugins {
  id 'com.zlad.gradle.avrohugger' version '0.2.1'
}

Если вы хотите скомпилировать исходники Scala, вам также нужна зависимость от библиотеки Scala:

plugins {
  id 'scala'
  id 'com.zlad.gradle.avrohugger' version '0.2.1'
}

repositories {
  mavenCentral()
}

dependencies {
  compile 'org.scala-lang:scala-library:2.12.8'
}

Классы Scala будут автоматически сгенерированы во время сборки перед задачей compileScala. По умолчанию схема avro должна быть в src/main/avro, а сгенерированные источники будут в build/generated-src/avro

Вы можете позвонить generateAvroScala, чтобы запустить генерацию источников Scala вручную.

Все подробности и параметры конфигурации вы можете найти на странице gradle-avrohugger-plugin github .

0 голосов
/ 25 ноября 2018

В итоге я использовал библиотеку avrohugger-tools в Gradle для автоматического создания классов дел в Scala всякий раз, когда мои схемы обновлялись. Ваш пробег может варьироваться, но это, наконец, сработало для меня:

build.gradle.kts

import java.io.File

plugins {
  scala
  id("com.github.maiflai.scalatest") version "0.19"
}

version = "1.0"

configurations {
  register("avrohugger-tools")
}

dependencies {
  // Scala std-libs
  implementation(Dependencies.Libs.Scala.library)

  // AvroHugger tools JAR
  "avrohugger-tools"("com.julianpeeters:avrohugger-tools_2.12:1.0.0-RC14")

  // testing
  testImplementation(gradleTestKit())
  testImplementation("junit:junit:4.12")
  testImplementation("org.scalatest:scalatest_2.12:3.0.5")
  testRuntime("org.pegdown:pegdown:1.4.2")
}

fun normalizeFileSeparator(path: String) = path.replace('/', File.separatorChar)

val genAvro = task<JavaExec>("genAvro") {
  val sourceAvroPath = normalizeFileSeparator("src/main/avro/")
  val sourceAvroFiles = fileTree(mapOf(
    "dir" to sourceAvroPath, "include" to listOf("**/*.avsc")
  ))
  val targetPath = normalizeFileSeparator("src/gen/")

  doFirst {
    delete(targetPath)
  }

  classpath = configurations["avrohugger-tools"]
  main = "avrohugger.tool.Main"

  args(
    "generate", "schema",
    sourceAvroFiles.files.joinToString(separator=" "),
    targetPath
  )

  inputs.files(sourceAvroFiles)
  outputs.files(targetPath)
}

the<JavaPluginConvention>().sourceSets.getByName(
  SourceSet.MAIN_SOURCE_SET_NAME
).java.srcDir("gen")

tasks.withType<ScalaCompile> {
  dependsOn(genAvro)
}

inline fun <reified T : Task> TaskContainer.existing() = existing(T::class)
inline fun <reified T : Task> TaskContainer.register(name: String, configuration: Action<in T>) = register(name, T::class, configuration)

Обратите внимание, что я также собираю / тестирую исходное дерево Scala в этом пакете, поэтому некоторые специфичные для Scala куски можно предположительно исключить.

Очень надеюсь, что это поможет!

...