Sbt 如何从AutoPlugin覆盖默认任务?

Sbt 如何从AutoPlugin覆盖默认任务?,sbt,sbt-plugin,Sbt,Sbt Plugin,假设我想要覆盖(替换)packageBin任务的默认设置。所以我很天真地写了一个这样的自动行李: object TestPlugin extends AutoPlugin { override def trigger = allRequirements override val projectSettings: Seq[Def.Setting[_]] = Seq( packageBin in Compile <<= (packageBin in Compile).

假设我想要覆盖(替换)packageBin任务的默认设置。所以我很天真地写了一个这样的自动行李:

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
    }  
  )

}

是否有可能通过AutoPlugin或经典插件实现这一点,如果有,如何实现?

我找到了问题的解决方案

为了确保AutoPlugin的设置不会被默认设置覆盖,必须在默认设置之后应用AutoPlugin中的设置。默认设置由包中的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
    }
  )
}
导入sbt_
导入密钥_
导入plugins.JvmPlugin
对象TestPlugin扩展了AutoPlugin{
覆盖def requires=JvmPlugin
覆盖def触发器=所有要求
覆盖val项目设置:Seq[定义设置[]]=Seq(
Compile中的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 ~= { a =>
      println("project/compile::packageBin")
      a
    }
  )
}
或者使用
和最后的
进行副作用的后处理:

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) andFinally {
      println("project/compile::packageBin")
    }
  )
}
导入sbt_
导入密钥_
导入plugins.JvmPlugin
对象TestPlugin扩展了AutoPlugin{
覆盖def requires=JvmPlugin
覆盖def触发器=所有要求
覆盖val项目设置:Seq[定义设置[]]=Seq(
Compile中的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) andFinally {
      println("project/compile::packageBin")
    }
  )
}