加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 08:56:26 所属栏目:安全 来源:网络整理
导读:我是 working on a sbt plugin,在使用 Slick code generator给出数据库的情况下生成Scala模型 我当然希望用户覆盖代码生成器,所以我的插件需要支持这个: 无论如何,我可以动态加载一个Scala类,给出build.sbt插件中的路径吗?例如,在用户的父build.sbt中,她会
我是 working on a sbt plugin,在使用 Slick code generator给出数据库的情况下生成Scala模型

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

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

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

解决方法

在一天结束时,您需要运行一些代码来生成Scala源文件.

生成文件

如您所知,sbt有一个用于生成名为sourceGenerators的源文件的钩子,这在Generating files中有记录.
作为插件作者,你应该提供一个任务,使用Slick代码生成器作为默认实现,在(编译中的sourceManaged).value /“garfield”下生成Seq [File].我们称之为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 task.如果您正在为Compile配置生成代码,那么使用转轮进行任何依赖于它的配置都不是一个好主意.
>另一种类似的方法是使用sbt.Fork API.分叉允许您在插件外部运行代码.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读