是否可以在sbt插件中编译文件?

时间:2012-09-11 18:09:51

标签: scala sbt

我有一个sbt插件,需要从源文件中获取编译器AST。我尝试使用以下代码创建一个新的编译器:

val settings = new Settings
settings.usejavacp.value = true
val compiler = new tools.nsc.interactive.Global(settings, new StoreReporter())

但是我收到以下错误:

java.lang.Error: typeConstructor inapplicable for <none>

似乎它与sbt的内部编译器发生了某种冲突。

那么,有没有办法从sbt内部获取这些文件的AST?

或者也许可以直接从sbt的编译器中获取它们? (那会更好,因为我不需要每次都重新编译所有内容)

编辑:

似乎使用tools.nsc.Global而不是“交互式”不会引发错误,但我不知道如何从中获取AST。

编辑:

当我尝试编译一些文件时,tools.nsc.Global失败并出现相同的错误:(

SBT FAQ声明在初始化编译器时我应该使用一些“代表类型” - settings.embeddedDefaults[MyType]。但我无法弄清楚我应该发送给它的确切内容。有人可以帮我吗?

1 个答案:

答案 0 :(得分:2)

这一行意味着使用java.class.path系统属性的值作为编译器的类路径:

settings.usejavacp.value = true

在sbt中,这只包括启动器jar,因为这是jvm初始化时类路径上的全部内容。 启动程序jar已使用ProGuard处理,因此它包含不完整的Scala类,并且永远不应位于编译器类路径上。

相反,根据您的需要显式设置类路径:

settings.classpath.value = "some;classpath"