scala - sbt 插件动态加载用户定义的代码?

标签 scala sbt slick slick-2.0 slick-codegen

我是working on a sbt plugin使用 Slick code generator 在给定数据库的情况下生成 Scala 模型

我当然希望用户覆盖代码生成器,所以我的插件需要支持这一点:

  • 无论如何,我可以在 build.sbt 插件键中动态加载给定路径的 Scala 类?例如,在用户的父 build.sbt 中,她会提供类似 codegen.override=com.company.project.CustomCodegenerator 的内容。其中looks like this
  • 与上述有关;自定义代码生成器可能会使用其他一些库,因此简单的动态类加载可能不够。无论如何,一个 sbt 插件可以使用该插件继承项目的依赖项吗?

  • 以下是对此的完整讨论:https://github.com/papauschek/play-slick-evolutions-plugin/issues/1

    最佳答案

    归根结底,您需要运行一些代码来生成 Scala 源文件。

    生成文件

    如您所知,sbt 有一个用于生成源文件的 Hook ,称为 sourceGenerators。 ,记录在 Generating files .
    作为插件作者,您应该提供一个生成 Seq[File] 的任务。在 (sourceManaged in Compile).value / "garfield" 下使用 Slick 代码生成器作为默认实现。我们称之为 generateModel .您的插件可能具有以下设置:

    sourceGenerators in Compile += generateModel.taskValue,
    generateModel := defaultGenerateModel.value,
    defaultGenerateModel := { ... }
    

    如果您的构建用户想要重新布线 generateModel ,他或她可以这样做:
    generateModel := {
      val file = (sourceManaged in Compile).value / "garfield" / "Foo.scala"
      IO.write(file, """case class Foo() {}""")
      Seq(file)
    }
    

    如果代码生成包含在 sbt 插件中,就像上面一样,你不需要做任何动态的事情。由于play-slick-evolutions-codegen-plugin取决于 slick-codegen,这应该不是问题。

    动态加载用户代码

    由于问题直接在于动态加载用户的代码,因此我也提出了一些指示。
  • 一种方法是使用 sbt.Run API从现有配置。这相当于调用 run带有一些自定义参数的任务。如果您正在为 Compile 生成代码配置,将运行器用于任何依赖它的配置都不是一个好主意。
  • 另一种类似的方法是使用 sbt.Fork API . fork 允许您在插件之外运行代码。

  • 鉴于 sbt 会根据它们之间的依赖关系自动排序任务并并行运行多个任务,动态执行的代码充满了意想不到的危险。

    关于scala - sbt 插件动态加载用户定义的代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27024934/

    相关文章:

    scala - Scala 编译器是否适用于 UTF-8 编码的源文件?

    ssh - 通过SSH在SBT任务中执行Shell脚本

    scala - sbt 程序集文档中的 "already part of the container?"是什么意思

    scala - Scala 中的事务方法 Play with Slick(可能类似于 Spring @Transactional?)

    java - 在Android中可以使用哪些编程语言进行开发?

    database - 如何使用 Anorm 和 Scala 从数据库中提取二进制信息

    scala - scala 集合中的 subsetOf 在哪里?

    Docker SBT 构建卡在 M2 芯片上以部署到 GKE

    scala - 在 Slick 中使用类型映射列进行查询

    postgresql - 在服务器端使用 over table 计算表列