我用单个任务写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}}我的插件已启用)。我该怎么做?
答案 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)
}
)
}