Why this change?
With a very simple repository for demonstration:
git clone https://github.com/leventeliu/godepgraph-demo.git
cd godepgraph-demo
Initially, when I was trying to get dep-graph inside a go module (given filter -o <prefix>
) with a relative import path syntax, godepgraph
gave an empty result:
$ godepgraph -o github.com/leventeliu ./cmd/nop
digraph godep {
splines=ortho
nodesep=0.4
ranksep=0.8
node [shape="box",style="rounded,filled"]
edge [arrowsize="0.5"]
}
After some code reading, I found the correct way to do it cloud be:
$ godepgraph -o .,github.com/leventeliu ./cmd/nop
digraph godep {
splines=ortho
nodesep=0.4
ranksep=0.8
node [shape="box",style="rounded,filled"]
edge [arrowsize="0.5"]
"./cmd/nop" [label="./cmd/nop" color="paleturquoise" URL="https://godoc.org/./cmd/nop" target="_blank"];
"./cmd/nop" -> "github.com/leventeliu/godepgraph-demo/a";
"./cmd/nop" -> "github.com/leventeliu/godepgraph-demo/b";
"github.com/leventeliu/godepgraph-demo/a" [label="github.com/leventeliu/godepgraph-demo/a" color="paleturquoise" URL="https://godoc.org/github.com/leventeliu/godepgraph-demo/a" target="_blank"];
"github.com/leventeliu/godepgraph-demo/b" [label="github.com/leventeliu/godepgraph-demo/b" color="paleturquoise" URL="https://godoc.org/github.com/leventeliu/godepgraph-demo/b" target="_blank"];
}
But it's weird, isn't it? The problem here is that the relative path ./cmd/nop
could (and should) be resolved as a full package path github.com/leventeliu/godepgraph-demo/cmd/nop
, which will not be ignored by the filter -o github.com/leventeliu
.
And after I tried the list
command:
$ go list ./cmd/nop
github.com/leventeliu/godepgraph-demo/cmd/nop
I thought this is the proper way to solve the problem.
List command is implemented by an internal package, which will be tricky to call directly. Alternatively, I use an os/exec.Command
to call go list
and pass the parent environment to the command (any better idea?)
Now it works well:
$ godepgraph -o github.com/leventeliu ./cmd/nop
digraph godep {
splines=ortho
nodesep=0.4
ranksep=0.8
node [shape="box",style="rounded,filled"]
edge [arrowsize="0.5"]
"github.com/leventeliu/godepgraph-demo/a" [label="github.com/leventeliu/godepgraph-demo/a" color="paleturquoise" URL="https://godoc.org/github.com/leventeliu/godepgraph-demo/a" target="_blank"];
"github.com/leventeliu/godepgraph-demo/b" [label="github.com/leventeliu/godepgraph-demo/b" color="paleturquoise" URL="https://godoc.org/github.com/leventeliu/godepgraph-demo/b" target="_blank"];
"github.com/leventeliu/godepgraph-demo/cmd/nop" [label="github.com/leventeliu/godepgraph-demo/cmd/nop" color="paleturquoise" URL="https://godoc.org/github.com/leventeliu/godepgraph-demo/cmd/nop" target="_blank"];
"github.com/leventeliu/godepgraph-demo/cmd/nop" -> "github.com/leventeliu/godepgraph-demo/a";
"github.com/leventeliu/godepgraph-demo/cmd/nop" -> "github.com/leventeliu/godepgraph-demo/b";
}
This improvement applies to the case when you are working with "GOPATH mode", instead of go module, too.
Also, this implies a special pattern /...
will be supported:
$ godepgraph -o github.com/leventeliu ./...
digraph godep {
splines=ortho
nodesep=0.4
ranksep=0.8
node [shape="box",style="rounded,filled"]
edge [arrowsize="0.5"]
"github.com/leventeliu/godepgraph-demo/a" [label="github.com/leventeliu/godepgraph-demo/a" color="paleturquoise" URL="https://godoc.org/github.com/leventeliu/godepgraph-demo/a" target="_blank"];
"github.com/leventeliu/godepgraph-demo/b" [label="github.com/leventeliu/godepgraph-demo/b" color="paleturquoise" URL="https://godoc.org/github.com/leventeliu/godepgraph-demo/b" target="_blank"];
"github.com/leventeliu/godepgraph-demo/cmd/nop" [label="github.com/leventeliu/godepgraph-demo/cmd/nop" color="paleturquoise" URL="https://godoc.org/github.com/leventeliu/godepgraph-demo/cmd/nop" target="_blank"];
"github.com/leventeliu/godepgraph-demo/cmd/nop" -> "github.com/leventeliu/godepgraph-demo/a";
"github.com/leventeliu/godepgraph-demo/cmd/nop" -> "github.com/leventeliu/godepgraph-demo/b";
}