从SBT内部向Scala编译器提供服务

时间:2016-01-28 19:57:56

标签: scala sbt scala-macros

我有一个Scala宏(有时)需要与外部服务通信。我们可以假设此服务托管在同一台计算机上。启动此服务非常昂贵(首次运行约3分钟,同一台机器上的后续运行约5秒),这就是它应该以某种方式“汇集”的原因。只是查询服务非常便宜。该服务提供Scala API。

天真的解决方案是将库添加到编译器类路径并执行类似

的操作
div

当然,如果对宏进行多次调用,这种情况会很慢。

我的想法是在SBT中启动服务并以某种方式将其提供给Scala编译器。这提出了一些有趣的问题。

  1. 如何传递启动参数? 潜在的解决方案:创建一个SBT插件,定义一些val instance = service.start(...) val tree = if (instance.query(...)) q"""new meep { ... }""" else context.abort("no can do") instance.teardown() tree
  2. 如何启动服务? 潜在的解决方案:在SBT插件中,定义一个自定义SettingKeys,用于检查服务是否已处于活动状态,如果没有,则根据设置启动它。但它会在何处引用该实例?在command中,使用State? [0]
  3. 如何告诉Scala编译器有关该服务的信息? 潜在的解决方案:不知道。这可能需要API的某种“垫片”,它可以放在编译器类路径上并与SBT内部通信。
  4. 如果有帮助,则假设该服务是“数据库”,其中宏检查特定的隐式推断是否是“允许的”。 SBT会调用systemd / ...来启动“数据库”守护进程。

    [0]旁注:由于宏并不总是需要与服务通信,因此让SBT按需启动它也是有意义的(除非这使问题复杂化)。

0 个答案:

没有答案