【问题标题】:Using sbt Avrohugger plugin in gradle在 gradle 中使用 sbt Avrohugger 插件
【发布时间】:2018-09-02 07:45:23
【问题描述】:

我正在使用 https://github.com/julianpeeters/avrohugger sbt 插件为 Avro .avsc 文件生成 Scala 案例类。如何在 Gradle 项目中使用相同的插件?

【问题讨论】:

    标签: scala gradle avro kafka-streams-scala


    【解决方案1】:

    我创建了用于从 Avro 架构生成 Scala 案例类的 gradle 插件,它在内部使用 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 page 上找到所有详细信息和配置选项。

    【讨论】:

    • 非常适合来自 avro 模式文件的 Scala 代码生成
    【解决方案2】:

    我最终使用 Gradle 中的 avrohugger-tools 库在架构更新时自动生成 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 的部分。

    真的希望这会有所帮助!

    【讨论】:

    • 谢谢。我会试试看的。
    猜你喜欢
    • 1970-01-01
    • 2015-08-23
    • 2011-07-30
    • 2016-12-11
    • 1970-01-01
    • 2011-04-16
    • 2016-07-27
    • 1970-01-01
    • 2014-10-30
    相关资源
    最近更新 更多