我有一个Scala宏(有时)需要与外部服务通信。我们可以假设此服务托管在同一台计算机上。启动此服务非常昂贵(首次运行约3分钟,同一台机器上的后续运行约5秒),这就是它应该以某种方式“汇集”的原因。只是查询服务非常便宜。该服务提供Scala API。
天真的解决方案是将库添加到编译器类路径并执行类似
的操作div
当然,如果对宏进行多次调用,这种情况会很慢。
我的想法是在SBT中启动服务并以某种方式将其提供给Scala编译器。这提出了一些有趣的问题。
val instance = service.start(...)
val tree =
if (instance.query(...))
q"""new meep { ... }"""
else
context.abort("no can do")
instance.teardown()
tree
。SettingKeys
,用于检查服务是否已处于活动状态,如果没有,则根据设置启动它。但它会在何处引用该实例?在command
中,使用State
? [0] 如果有帮助,则假设该服务是“数据库”,其中宏检查特定的隐式推断是否是“允许的”。 SBT会调用systemd / ...来启动“数据库”守护进程。
[0]旁注:由于宏并不总是需要与服务通信,因此让SBT按需启动它也是有意义的(除非这使问题复杂化)。