假设我要覆盖(替换)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
    }
  )
}

09-28 10:20