我正在尝试检查 SBT 依赖关系树,如 文档中所述:
sbt inspect tree clean
但我收到此错误:
[error] inspect usage:
[error] inspect [uses|tree|definitions] <key> Prints the value for 'key', the defining scope, delegates, related definitions, and dependencies.
[error]
[error] inspect
[error] ^
出了什么问题?为什么SBT不建树?
如果您想实际查看库依赖项(就像使用 Maven 一样)而不是任务依赖项(这就是
inspect tree
显示的内容),那么您需要使用 sbt-dependency-graph 插件。
将以下内容添加到您的project/plugins.sbt(或全局plugins.sbt)中。
addSbtPlugin("net.virtual-void" % "sbt-dependency-graph" % "0.9.2")
然后您就可以访问
dependencyTree
命令和其他命令。
使用 sbt 1.4.0,
dependencyTree
任务可以在 sbt 中使用,无需使用插件:
> sbt dependencyTree
sbt-dependency-graph 包含在 sbt 1.4.0:
sbt 1.4.0 将 Johannes Rudolph 的 sbt-dependency-graph 插件引入代码库。由于它为每个子项目注入许多任务,因此该插件分为两部分:
即默认启用,将MiniDependencyTreePlugin
任务引入dependencyTree
和Compile
配置Test
- 完全强度
通过将以下内容置于DependencyTreePlugin
来启用:project/plugins.sbt
addDependencyTreePlugin
请参阅旧的自述文件以获取可用任务列表。
当从命令行运行时,发送到 sbt 的每个参数都应该是一个命令,所以
sbt inspect tree clean
将:
inspect
命令,tree
命令,clean
命令这显然失败了,因为
inspect
需要一个参数。这将实现您想要的:
sbt "inspect tree clean"
如果你想查看库依赖关系,可以使用
coursier
插件:https://github.com/coursier/coursier/blob/master/doc/FORMER-README.md#printing-trees
输出示例: 文本(无颜色):https://gist.github.com/vn971/3086309e5b005576533583915d2fdec4
请注意,该插件与打印树具有完全不同的性质。它专为快速并发依赖项下载而设计。但它很好,几乎可以添加到任何项目中,所以我认为值得一提。
我尝试使用上面提到的
"net.virtual-void" % "sbt-dependency-graph"
插件,得到了 9K 行作为输出(有很多空行和重复项),而 Maven 的 mvn dependency:tree
中的输出则为 180 行(我的项目中的每个依赖项正好一行)。
输出。所以我为 Maven 目标编写了一个 sbt 包装器task,这是一个丑陋的 hack,但它有效:
// You need Maven installed to run it.
lazy val mavenDependencyTree = taskKey[Unit]("Prints a Maven dependency tree")
mavenDependencyTree := {
val scalaReleaseSuffix = "_" + scalaVersion.value.split('.').take(2).mkString(".")
val pomXml =
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>groupId</groupId>
<artifactId>artifactId</artifactId>
<version>1.0</version>
<dependencies>
{
libraryDependencies.value.map(moduleId => {
val suffix = moduleId.crossVersion match {
case binary: sbt.librarymanagement.Binary => scalaReleaseSuffix
case _ => ""
}
<dependency>
<groupId>{moduleId.organization}</groupId>
<artifactId>{moduleId.name + suffix}</artifactId>
<version>{moduleId.revision}</version>
</dependency>
})
}
</dependencies>
</project>
val printer = new scala.xml.PrettyPrinter(160, 2)
val pomString = printer.format(pomXml)
val pomPath = java.nio.file.Files.createTempFile("", ".xml").toString
val pw = new java.io.PrintWriter(new File(pomPath))
pw.write(pomString)
pw.close()
println(s"Formed pom file: $pomPath")
import sys.process._
s"mvn -f $pomPath dependency:tree".!
}
这对我有用。参考这里 对于 sbt < 1.3 use:
addSbtPlugin("net.virtual-void" % "sbt-dependency-graph" % "0.10.0-RC1")
然后
sbt compile:dependencyTree
从
sbt 1.4
开始添加到您的 project/plugins.sbt
如下行:
addDependencyTreePlugin
然后你就准备好了这些功能:
$ sbt dependencyTree
$ sbt dependencyBrowseTree
$ sbt dependencyBrowseGraph
...
后两者在浏览器中具有图形输出,
...Tree
一个具有增量搜索功能。
(所有任务的列表仍然被提及这里即使它尚未存档)
您现在可以在 IDEA 中使用 intellij-sbt-dependency-analyzer 插件了。