我是working on a sbt plugin使用 Slick code generator 在给定数据库的情况下生成 Scala 模型
我当然希望用户覆盖代码生成器,所以我的插件需要支持这一点:
codegen.override=com.company.project.CustomCodegenerator
的内容。其中looks like this 以下是对此的完整讨论: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/