【问题标题】:How can a default task be overridden from an AutoPlugin?如何从 AutoPlugin 覆盖默认任务?
【发布时间】:2014-10-04 12:58:04
【问题描述】:

假设我想覆盖(替换)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 或经典插件实现这一点,如果可以,如何实现?

【问题讨论】:

    标签: sbt sbt-plugin


    【解决方案1】:

    我找到了问题的解决方案here

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

    所以我要做的就是通过向我的 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
        }
      )
    }
    

    【讨论】:

      【解决方案2】:

      只是为了从@user1752169 完成the answer,这里有一个更短(不一定更容易理解)的解决方案,带有被遗忘的运算符~=

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

      或使用andFinally 进行副作用后处理:

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

      作为一个不错的补充,您可以将自动插件代码保存到 any 项目中的project/src/main/scala,并且无需太多工作即可激活插件(并在更改时不断更新)。

      【讨论】:

        猜你喜欢
        • 2017-11-26
        • 2011-12-28
        • 2021-03-18
        • 2016-09-16
        • 2014-07-21
        • 2018-04-09
        • 2019-05-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多