我正在尝试使用带有sbt的编译器插件(我在0.13.5上),在我的build.sbt中传递为:
autoCompilerPlugins := true
scalacOptions += "-Xplugin:myCompilerPluginJar.jar"
这有效,插件运行,但是我真的只想在一些显式编译上运行插件(可能使用范围编译任务或自定义任务)。
如果我尝试这样的话:
val PluginConfig = config("plugin-config") extend(Compile)
autoCompilerPlugins := true
scalacOptions in PluginConfig += "-Xplugin:myCompilerPluginJar.jar"
该插件无法在" plugin-config:compile"上运行。事实上,如果我有
scalacOptions in Compile += "-Xplugin:myCompilerPluginJar.jar"
该插件仍在"测试:编译"或在任何其他范围编译。我猜我可能对配置/范围没有正确理解。
我也尝试过:
lazy val pluginCommand = Command.command("plugincompile") { state =>
runTask(compile in Compile,
append(Seq(scalacOptions in Compile += "Xplugin:myCompilerPluginJar.jar"), state)
)
state
}
commands += pluginCommand
但插件实际上并没有在该命令上运行,所以我可能不会理解那里的东西。
欢迎任何欢迎。
答案 0 :(得分:1)
所以我来到了hacky解决方案;我想我会在这里分享,以防其他人偶然发现这个问题。
val safeCompile = TaskKey[Unit]("safeCompile", "Compiles, catching errors.")
safeCompile := (compile in Compile).result.value.toEither.fold(
l => {
println("Compilation failed.")
}, r => {
println("Compilation success. " + r)})
//Hack to allow "-deprecation" and "-unchecked" in scalacOptions by default
scalacOptions <<= scalacOptions map { current: Seq[String] =>
val default = "-deprecation" :: "-unchecked" :: Nil
if (current.contains("-Xplugin:myCompilerPluginJar.jar")) current else default
}
addCommandAlias("depcheck", "; set scalacOptions := Seq(\"-deprecation\", \"-unchecked\", \"-Xplugin:myCompilerPluginJar.jar\"); safeCompile; set scalacOptions := Seq(\"-deprecation\", \"-unchecked\")")
作为快速指南,此代码:
欢迎提出意见,如果您能获得更清洁的工作,请分享!