go version)?$ go version go version go1.12.5 linux/amd64
Yes
go env)?go env Output
$ go env
GOARCH="amd64"
GOBIN=""
GOCACHE="/home/jaime/.cache/go-build"
GOEXE=""
GOFLAGS="-mod=vendor"
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOOS="linux"
GOPATH="/home/jaime/go"
GOPROXY=""
GORACE=""
GOROOT="/usr/local/go"
GOTMPDIR=""
GOTOOLDIR="/usr/local/go/pkg/tool/linux_amd64"
GCCGO="gccgo"
CC="clang"
CXX="clang++"
CGO_ENABLED="1"
GOMOD=""
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build448668772=/tmp/go-build -gno-record-gcc-switches"
I tried to install goimports from my home directory.
$ echo $GO111MODULE
on
$ echo $GOFLAGS
-mod=vendor
$ pwd
/home/jaime
$ go get golang.org/x/tools/cmd/goimports
go get: disabled by -mod=vendor
$
I expected the tool to work like it has for years. I expected go get to download and install goimports.
I got an error about -mod=vendor being on.
In my environment, we use vendoring. Because Go is moving away from dep and moving towards modules, we've started doing the work to migrate to modules.
A temporary work around for this bug is to do this.
GO111MODULE=off go get golang.org/x/tools/cmd/goimports
Assuming you vendor your tools, you can try go install -mod=vendor golang.org/x/tools/cmd/goimports or go build -mod=vendor golang.org/x/tools/cmd/goimports
Edit: Just realized I misunderstood what you were trying to do
This is more of an issue with -mod=vendor. Possible things you could try are
-mod=vendor off.GOFLAGS='' go get golang.org/x/tools/cmd/goimports
tools.go in the repo that references the tools you'd want to use.// +build tools
package tools
import (
_ "golang.org/x/tools/cmd/goimports"
// and other tools used
)
-mod=vendor unnecessary in the general case.go get) to install a binary independent of the current module.Note that the argument to go get is a package, and go get some/package implicitly selects the latest version. That version can be arbitrarily different from what is in the vendor directory, so go get -mod=vendor really does seem like a contradictory command.
On the other hand, go get -mod=readonly intentionally ignores the -mod flag, precisely so that you _can_ set it in GOFLAGS. Perhaps go get -mod=vendor should do the same.
Change https://golang.org/cl/198438 mentions this issue: cmd/go: remove the -mod flag from 'go get'
I ran into this problem recently where a CI build was installing github.com/golang/gomock/mockgen so that we could run go generate to confirm any generated files were in sync. However as a newer version of gomock was released, this started updating go.mod with the new version rather than sticking with what was pinned in our go.mod.
Seems the solution was to switch to go install github.com/golang/gomock as we always run go mod download && go mod vendor beforehand and this seems to use the pinned version, or at least doesn't update go.mod. I'm not sure it this is entirely correct, but posting in case someone else stumbles over this issue and is looking for something to workaround.
Most helpful comment
This is more of an issue with
-mod=vendor. Possible things you could try are-mod=vendoroff.tools.goin the repo that references the tools you'd want to use.