如何从AutoPlugin覆盖默认任务?

use*_*169 4 sbt sbt-plugin

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

}
Run Code Online (Sandbox Code Playgroud)

但这不起作用(至少不适用于SBT 0.13.5和0.13.6-M1),我的版本packageBin从未调用过.如果我将以下行放在项目的build.sbt文件中,那么它可以工作.

packageBin in Compile <<= (packageBin in Compile).map { a => println("project/compile::packageBin"); a }
Run Code Online (Sandbox Code Playgroud)

是否有可能从AutoPlugin或经典插件中实现这一点,如果是这样,怎么样?

use*_*169 6

我在这里找到了问题的解决方案.

为了确保默认设置不会覆盖AutoPlugin的设置,必须在默认设置后应用AutoPlugin中的设置.默认设置由软件包sbt.plugins(CorePlugin,IvyPlugin,JvmPlugin)中的AutoPlugins设置.

所以我必须做的就是通过向我的AutoPlugin添加以下覆盖来使我的AutoPlugin依赖于JvmPlugin:

override def requires: Plugins = JvmPlugin
Run Code Online (Sandbox Code Playgroud)

覆盖的完整autoplugin 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
    }
  )
}
Run Code Online (Sandbox Code Playgroud)