运行 元构建级别的 sbt 命令

running sbt command on the meta-build level

sbt 允许我们在根项目级别 运行 sbt 命令。

如何在元构建级别上 运行 命令? (在 root/project/project 目录中定义)

我的用例是我的一些 sbt 插件具有相同依赖项的不同版本,并且旧的依赖项被驱逐。我想调查使用 sbt-dependency-graph

作为解决方法,我做了以下事情:

在文件中 root/project/plugins.sbt :

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

并且在文件 root/project/build.sbt 中:

(compile in Compile) := {
  (dependencyBrowseGraph in Compile).value
  (compile in Compile).value
}

这会导致 dependencyBrowseGraph 任务在编译后变为 运行。它解决了我的具体问题,但不是很方便,所以很高兴听到正确的方法。

正确的做法是运行 sbt in root/project。你通常只是 运行 它在 root/ 上,诀窍是 cd 到 project 和 运行 那里。如果要查看meta build中解析的库依赖,可以在root/project/project/plugins.sbt中添加sbt dependency graph plugin(注意project的重复),然后应该可以运行 dependencyBrowseGraph 来自 sbt shell.

您可以使用主项目 sbt 会话中的 reload plugins 切换到构建项目的上下文:

sbt:root> reload plugins
[snip noise]

sbt:project> show libraryDependencies
[shows your sbt plugins from root/plugins.sbt along with their deps]

sbt:project> reload return
[back to the main project]

sbt:root>

As Jorge , you can install sbt-dependency-graph in the meta-build of root/project/project/plugins.sbt to make it available to the build project context of reload plugins. As always, recall that sbt is recursive—从构建项目中,您可以再次reload plugins 达到元构建级别。例如,从那里 show libraryDependencies 将仅显示来自 root/project/project 的 sbt-dependency-graph。

在我看来,这是 sbt UX 的一个古怪方面,因为 reload 命令将成为此功能的路径并不完全直观,但只要你能记住那部分,help reload 为回忆子命令提供了很好的总结。

我不知道这是否是 "wrong" 任何方面的方法,但我发现它比更改目录更方便,因为我不需要启动另一个 sbt 会话,并且可以在不重新启动的情况下来回移动或进一步递归。