针对不同范围或任务的不同scalac选项?

时间:2014-08-21 01:08:31

标签: sbt

我正在尝试使用带有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

但插件实际上并没有在该命令上运行,所以我可能不会理解那里的东西。

欢迎任何欢迎。

1 个答案:

答案 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\")")

作为快速指南,此代码:

  • 定义运行“编译:编译”任务的自定义任务“safeCompile”,但即使出现错误也会成功(这是必需的,以便稍后定义的命令序列在编译失败时不会中断)。
  • 声明“scalacOptions”依赖于一个函数,该函数检查插件是否已打开(如果是,则保持选项不变),否则将选项设置为我想要的项目默认值(Seq(“ - deprecation”) ,“-unchecked”))。这是一个hack,因此默认情况下这些设置是打开的,因此裸“scalacOptions:=”定义不会覆盖别名命令序列中完成的设置。 (使用Seq.append和Seq.distinct可能是一个更好的方法来做这个hacky部分。)
  • 定义一个别名命令序列:打开插件,safeCompiles,关闭插件。

欢迎提出意见,如果您能获得更清洁的工作,请分享!