depth
is tool to retrieve and visualize Go source code dependency trees.
Download the appropriate binary for your platform from the Releases page, or:
go get github.com/KyleBanks/depth/cmd/depth
depth
can be used as a standalone command-line application, or as a package within your own project.
Simply execute depth
with one or more package names to visualize. You can use the fully qualified import path of the package, like so:
$ depth github.com/KyleBanks/depth/cmd/depth
github.com/KyleBanks/depth/cmd/depth
โ encoding/json
โ flag
โ fmt
โ io
โ log
โ os
โ strings
โ github.com/KyleBanks/depth
โ fmt
โ go/build
โ path
โ sort
โ strings
12 dependencies (11 internal, 1 external, 0 testing).
Or you can use a relative path, for example:
$ depth .
$ depth ./cmd/depth
$ depth ../
You can also use depth
on the Go standard library:
$ depth strings
strings
โ errors
โ internal/bytealg
โ io
โ sync
โ unicode
โ unicode/utf8
โ unsafe
7 dependencies (7 internal, 0 external, 0 testing).
Visualizing multiple packages at a time is supported by simply naming the packages you'd like to visualize:
$ depth strings github.com/KyleBanks/depth
strings
โ errors
โ internal/bytealg
โ io
โ sync
โ unicode
โ unicode/utf8
โ unsafe
7 dependencies (7 internal, 0 external, 0 testing).
github.com/KyleBanks/depth
โ bytes
โ errors
โ go/build
โ os
โ path
โ sort
โ strings
7 dependencies (7 internal, 0 external, 0 testing).
By default, depth
only resolves the top level of dependencies for standard library packages, however you can use the -internal
flag to visualize all internal dependencies:
$ depth -internal strings
strings
โ errors
โ โ internal/reflectlite
โ โ internal/unsafeheader
โ โ โ unsafe
โ โ runtime
โ โ โ internal/abi
โ โ โ โ unsafe
โ โ โ internal/bytealg
โ โ โ โ internal/cpu
โ โ โ โ unsafe
โ โ โ internal/cpu
โ โ โ internal/goexperiment
โ โ โ runtime/internal/atomic
โ โ โ โ unsafe
โ โ โ runtime/internal/math
โ โ โ โ runtime/internal/sys
โ โ โ runtime/internal/sys
โ โ โ unsafe
โ โ unsafe
โ internal/bytealg
โ io
โ โ errors
โ โ sync
โ โ internal/race
โ โ โ unsafe
โ โ runtime
โ โ sync/atomic
โ โ โ unsafe
โ โ unsafe
โ sync
โ unicode
โ unicode/utf8
โ unsafe
18 dependencies (18 internal, 0 external, 0 testing).
The -max
flag limits the dependency tree to the maximum depth provided. For example, if you supply -max 1
on the depth
package, your output would look like so:
$ depth -max 1 github.com/KyleBanks/depth/cmd/depth
github.com/KyleBanks/depth/cmd/depth
โ encoding/json
โ flag
โ fmt
โ io
โ log
โ os
โ strings
โ github.com/KyleBanks/depth
7 dependencies (6 internal, 1 external, 0 testing).
The -max
flag is particularly useful in conjunction with the -internal
flag which can lead to very deep dependency trees.
By default, depth
ignores dependencies that are only required for testing. However, you can view test dependencies using the -test
flag:
$ depth -test strings
strings
โ bytes
โ errors
โ fmt
โ internal/bytealg
โ internal/testenv
โ io
โ math/rand
โ reflect
โ strconv
โ sync
โ testing
โ unicode
โ unicode/utf8
โ unsafe
14 dependencies (14 internal, 0 external, 7 testing).
The -explain
flag instructs depth
to print import chains in which the
target-package
is found:
$ depth -explain strings github.com/KyleBanks/depth/cmd/depth
github.com/KyleBanks/depth/cmd/depth -> strings
github.com/KyleBanks/depth/cmd/depth -> github.com/KyleBanks/depth -> strings
The -json
flag instructs depth
to output dependencies in JSON format:
$ depth -json github.com/KyleBanks/depth/cmd/depth
{
"name": "github.com/KyleBanks/depth/cmd/depth",
"deps": [
{
"name": "encoding/json",
"internal": true,
"deps": null
},
...
{
"name": "github.com/KyleBanks/depth",
"internal": false,
"deps": [
{
"name": "go/build",
"internal": true,
"deps": null
},
...
]
}
]
}
The depth
package can easily be used to retrieve the dependency tree for a particular package in your own project. For example, here's how you would retrieve the dependency tree for the strings
package:
import "github.com/KyleBanks/depth"
var t depth.Tree
err := t.Resolve("strings")
if err != nil {
log.Fatal(err)
}
// Output: "'strings' has 4 dependencies."
log.Printf("'%v' has %v dependencies.", t.Root.Name, len(t.Root.Deps))
For additional customization, simply set the appropriate flags on the Tree
before resolving:
import "github.com/KyleBanks/depth"
t := depth.Tree {
ResolveInternal: true,
ResolveTest: true,
MaxDepth: 10,
}
err := t.Resolve("strings")
depth
was developed by Kyle Banks.
depth
is available under the MIT license.