tracking down broken module dependency golint

204 views
Skip to first unread message

Joseph Lorenzini

unread,
Jun 3, 2019, 9:52:52 AM6/3/19
to golang-nuts
Hi all,

I've been happily using go modules for several months. A couple days ago, I decided to update my dependencies with go get -u. This failed with:



So then I added a replace directive but that failed too because of https://github.com/golang/go/issues/26904

Which means as long as I depend on the golint package,  then go get -u will not work. And then it occurred to me: how and why is this package being pulled in? If i can remove my module's transitive dependency on golint, then go get -u will start working. So I first ran go mod tidy. Then I used go mod why however that was no help because whenever i executed go mod why on the module, this is the output returned:

(main module does not need module github.com/golang/lint)

I also verified that github.com/golang/lint is not in my go.mod after running go mod tidy. My understanding of tidy is that it pulls in direct and transitive module dependencies ergo if go get -u is trying to upgrade my deps according to go.mod, then it should be in my go.mod. So I am stumped why go get -u is trying to upgrade golint, when according to go mod tidy, my go.mod file, and go mod why, I don't have a dependency on it.

Any advice would be appreciated.

Thanks,
Joe



t hepudds

unread,
Jun 3, 2019, 10:35:13 AM6/3/19
to golang-nuts
For this error:


      github.com/golang/li...@v0.0.0-20190409202823-959b441ac422: parsing go.mod: unexpected module path "golang.org/x/lint"

That is saying 'github.com/golang/lint' was loaded, but the 'go.mod' found at that location for that version had a different module name ('golang.org/x/lint') declared in the go.mod there. The 'go' command does not allow that mismatch between how a module is referenced vs. how the module declares its identity in its go.mod.

You can probably make it work by adding a 'replace' statement for github.com/golang/lint using the version from just before the 'go.mod' was added there.

Here is an example.

First, verify we get a similar failure with 'go get -u' for this old version of zipkin-go:
    $ cd $(mktemp -d)
    $ git clone -b v0.1.5 --depth=1 https://github.com/openzipkin/zipkin-go .
    $ go get -u 
  
...which fails with the same error you reported:
      github.com/golang/li...@v0.0.0-20190409202823-959b441ac422: parsing go.mod: unexpected module path "golang.org/x/lint"

We can add a replace for the version of github.com/golang/lint from just before the 'go.mod' was added there. This will be a temporary measure that allows this upgrade to succeed, and then 'go mod tidy' will drop github.com/golang/lint from the module graph as no longer needed in this case.

   $ echo 'replace github.com/golang/lint => github.com/golang/lint 5614ed5bae' >> go.mod
   $ go get -u
   $ go mod tidy
   $ go mod graph | grep github.com/golang/lint

...which now succeeds, and the grep finds nothing for the older github.com name.

There is a good chance that technique will work for you. There is a longer explanation of why that error occurs and why that technique usually works in this troubleshooting FAQ on the "Modules" wiki:


An alternative solution can be to try with the tip / master version of Go, which has better upgrade logic that can often sidestep this problem, and also often has a better error message for this situation:

   $ go get golang.org/dl/gotip && gotip download
   $ gotip get -u all
   $ gotip mod tidy

Hope that helps, but reply back to the list with more details if it does not.

Regards,
thepudds
Reply all
Reply to author
Forward
0 new messages