在AutoPlugin插件的任务中表彰项目依赖性?

时间:2014-05-22 17:23:46

标签: sbt

我用单个任务写AutoPlugin。我希望在依赖项目中依赖于相同任务的任务。

所以给出:

lazy val projectA = project in file("projectA") enablePlugins(MyPlugin)

lazy val projectB = project in file("projectB")
    .enablePlugins(MyPlugin)
    .dependsOn(projectA, someOtherProject)

...然后projectB中的插件任​​务应该依赖于projectA中的插件任​​务(但不是someOtherProject,因为它不是{{1}}我的插件已启用)。我该怎么做?

1 个答案:

答案 0 :(得分:2)

您可以使用ScopeFilter。例如,不包含插件的项目将通过插件未定义添加任务。

因此,假设你有一个插件,输出让我们说项目名称。您可以定义范围过滤器,它将搜索当前项目的依赖关系。

val dependantProjects = ScopeFilter(
    inDependencies(ThisProject)
)

现在,在您的自定义任务中,您必须找到已定义该任务的依赖项目。

override def projectSettings: Seq[Setting[_]] = Seq(
  outputProjectName := {
    (outputProjectName.?).all(dependantProjects).value
    println(name.value)
  }
)

由于某些项目可能未定义任务,例如 someOtherProject ,您必须添加.?as documented 在设置或任务中基础类型T,它不接受任何参数,并返回类型为Option [T]的设置或任务。

完整的插件代码可能如下所示。

import sbt._
import Keys._

object MyPlugin extends AutoPlugin {

  object autoImport {
    val outputProjectName = taskKey[Unit]("Prints project name")
  }

  import autoImport._

  val dependantProjects = ScopeFilter(
    inDependencies(ThisProject)
  ) 

  override def projectSettings: Seq[Setting[_]] = Seq(
    outputProjectName := {
      (outputProjectName.?).all(dependantProjects).value
      println(name.value)
    }
  )

}