【发布时间】:2017-04-03 21:25:08
【问题描述】:
我正在尝试执行一项简单的任务(同时再次学习 SBT)。在花了大约 8 小时试图找出解决方案、遇到许多死胡同、阅读大量 SBT 文档和 SO 条目并积累了大量的愤怒和沮丧之后,我将问题发布在这里。
我需要实现一个任务,transitiveBaseDirectories,它将(在 sbt 控制台中)允许我在多项目构建中查询项目是否依赖于项目任务(示例结构在本文末尾),例如这个:
projectA/transitiveBaseDirectories
(组成所需的输出)
Seq(File("./projectA"), File("./projectAA"), File("./projectAAA"), File("./projectAB")))
对于这个示例项目
lazy val transitiveBaseDirectories = taskKey[Seq[File]](
"Returns a list of baseDirectory-ies of all projects a given project transitively depends on."
)
def transitiveBaseDirectoriesImpl = ???
lazy val root = project.dependsOn(projectA, projectB)
lazy val projectA = project.dependsOn(projectAA, projectAB)
lazy val projectAA = project.dependsOn(projectAAA)
lazy val projectAAA = project
lazy val projectAB = project.dependsOn(projectAB)
lazy val projectB = project
那么有必要以某种方式使 transitiveBaseDirectories 可用于所有项目 - 我也不知道该怎么做。
我故意不在这里展示我所有失败的尝试(Product.extract(state.value)、baseDirectory.all(ScopeFilter(inDependencies(...))) 等的各种尝试)。在我的 SBT 探索中,我有好几次“几乎就在那里”的感觉,随后是一波又一波的困惑和意识到我只是没有获得完成任务所必需的 SBT 大图,以及更多的挫败感。我已经放弃了,再次,这可能是我第三次在 SBT 中实施一项重要任务,而且它从来没有很好的结束(在更好的情况下,我成功了,但我并没有真正理解我做了什么)。
我真的很感激这里有一个最小但完整的解决方案,因为我已经完成了太多次了,如果我没有要求太多的话。
非常感谢。
【问题讨论】: