假设我要覆盖(替换)packageBin
任务的默认设置。所以我天真地写了一个这样的AutoPlugin:
object TestPlugin extends AutoPlugin {
override def trigger = allRequirements
override val projectSettings: Seq[Def.Setting[_]] = Seq(
packageBin in Compile <<= (packageBin in Compile).map { a =>
println("project/compile::packageBin")
a
}
)
}
但这是行不通的(至少不适用于SBT 0.13.5和0.13.6-M1),我的
packageBin
版本从未调用过。如果将以下行放入项目的build.sbt
文件中,则它将起作用。packageBin in Compile <<= (packageBin in Compile).map { a => println("project/compile::packageBin"); a }
是否可以通过AutoPlugin或经典插件完全实现这一目标,如果可以,如何实现?
最佳答案
我找到了问题here的解决方案。
为了确保默认设置不会覆盖自动插件的设置,必须在默认设置之后应用自动插件的设置。默认设置由软件包sbt.plugins中的AutoPlugins设置(CorePlugin,IvyPlugin,JvmPlugin)。
因此,我要做的就是通过向AutoPlugin中添加以下替代内容,使AutoPlugin依赖于JvmPlugin:
override def requires: Plugins = JvmPlugin
带有覆盖
packageBin
的完整自动插件如下:import sbt._
import Keys._
import plugins.JvmPlugin
object TestPlugin extends AutoPlugin {
override def requires = JvmPlugin
override def trigger = allRequirements
override val projectSettings: Seq[Def.Setting[_]] = Seq(
packageBin in Compile <<= (packageBin in Compile).map { a =>
println("project/compile::packageBin")
a
}
)
}