Skip to content

cmd/go: go get can't fetch tools with mod=vendor #32502

Closed

Description

@variadico

What version of Go are you using (go version)?

$ go version
go version go1.12.5 linux/amd64

Does this issue reproduce with the latest release?

Yes

What operating system and processor architecture are you using (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"

What did you do?

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
$ 

What did you expect to see?

I expected the tool to work like it has for years. I expected go get to download and install goimports.

What did you see instead?

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

Activity

  1. AlexRouSg commented on Jun 9, 2019

    @AlexRouSg
    Contributor

    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

  2. mazei513 commented on Jun 10, 2019

    @mazei513

    This is more of an issue with -mod=vendor. Possible things you could try are

    1. Temporarily set -mod=vendor off.
    GOFLAGS='' go get golang.org/x/tools/cmd/goimports
    
    1. Create a file named something like 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
    )
    
  3. bcmills commented on Jun 10, 2019

    @bcmills
    Contributor

    #30240 may make the -mod=vendor unnecessary in the general case.

    #30515 tracks some sort of command (probably a flag for 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.

  4. added
    NeedsInvestigationSomeone must examine and confirm this is a valid issue and not a duplicate of an existing one.
    on Jun 10, 2019
  5. added this to the Go1.14 milestone on Jun 10, 2019
  6. gopherbot commented on Oct 3, 2019

    @gopherbot
    Contributor

    Change https://golang.org/cl/198438 mentions this issue: cmd/go: remove the -mod flag from 'go get'

  7. self-assigned this
    on Oct 3, 2019
  8. electrofelix commented on Feb 27, 2020

    @electrofelix

    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.

  9. locked and limited conversation to collaborators on Feb 26, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    FrozenDueToAgeNeedsInvestigationSomeone must examine and confirm this is a valid issue and not a duplicate of an existing one.modules

    Type

    No type

    Projects

    No projects

      Milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions