如何编写依赖于另一个插件任务的插件?

How to write a plugin which depends on a task from another plugin?

有一个很棒的 sbt 插件 sbt-dependency-graph,它提供了一个 dependencyTree 任务来显示依赖关系。

我想写一个依赖它的sbt插件,但总是失败。

build.sbt

sbtPlugin := true

name := "my-sbt-plugin-depends-on-another"

version := "0.1.2.1"

organization := "test20140913"

addSbtPlugin("net.virtual-void" % "sbt-dependency-graph" % "0.7.5")

src/main/scala/MySbtPlugin.scala

import sbt._

object MySbtPlugin extends AutoPlugin {

  object autoImport {
    lazy val hello = taskKey[Unit]("hello task from my plugin")
    lazy val hello2 = taskKey[Unit]("hello task from my plugin2")
  }

  import autoImport._

  override def trigger = allRequirements

  override def requires = plugins.JvmPlugin

  val helloSetting = hello := println("Hello from my plugin")

  val helloSetting2 = hello2 := {
    println("hello2, task result from another plugins:")
    println(net.virtualvoid.sbt.graph.Plugin.dependencyTree.value)
    println("=========================================")
  }

  override def projectSettings = Seq(
    helloSetting, helloSetting2
  )

}

然后我发布到本地,在另一个项目中使用:

build.sbt

name := "sbt--plugin-test"

version := "1.0"

scalaVersion := "2.11.6"

net.virtualvoid.sbt.graph.Plugin.graphSettings

project/plugins.scala

logLevel := Level.Info

addSbtPlugin("net.virtual-void" % "sbt-dependency-graph" % "0.7.5")

addSbtPlugin("test20140913" % "my-sbt-plugin-depends-on-another" % "0.1.2.1")

当我在后面的项目运行sbt时,报告:

Reference to undefined setting:

  *:dependencyTree from *:hello2 (/Users/twer/workspace/my-sbt-plugin-depends-on-another/src/main/scala/test20140913/MySbtPlugin.scala:38)
     Did you mean provided:dependencyTree ?

    at sbt.Init$class.Uninitialized(Settings.scala:262)
    at sbt.Def$.Uninitialized(Def.scala:10)
    at sbt.Init$class.delegate(Settings.scala:188)
    at sbt.Def$.delegate(Def.scala:10)

哪里错了?

PS:插件代码在这里:https://github.com/freewind/my-sbt-plugin-depends-on-another

dependencyTree 仅针对特定配置定义(好吧 all of them),但它会自动委托给 shell.

中的 Compile

尝试像这样定义 hello2

  val helloSetting2 = hello2 := {
    println("hello2, task result from another plugins:")
    import net.virtualvoid.sbt.graph.Plugin.dependencyTree
    println((dependencyTree in Compile).value)
    println("=========================================")
  }