Unable to generate mocks in reflect mode #494
Description
Actual behavior A clear and concise description of what the bug is.
My project uses Go modules, but due to the CI restrictions we also make use of the vendor
folder.
So, our modules are synced by go mod tidy && go mod vendor
command.
While using mockgen
in a reflect
mode, I'm unable to generate mocks. Can't pinpoint exactly when this became broken as this was working fine before, but it doesn't anymore.
The error message:
❯ go generate ./...
/Users/nezorflame/Go/src/github.com/nezorflame/mockgen-test - service - doc.go
prog.go:12:2: cannot find package "." in:
/Users/nezorflame/Go/src/github.com/nezorflame/mockgen-test/vendor/github.com/golang/mock/mockgen/model
prog.go:12:2: cannot find package "." in:
/Users/nezorflame/Go/src/github.com/nezorflame/mockgen-test/vendor/github.com/golang/mock/mockgen/model
prog.go:12:2: cannot find module providing package github.com/golang/mock/mockgen/model: working directory is not part of a module
prog.go:14:2: cannot find module providing package github.com/nezorflame/mockgen-test/internal/client: working directory is not part of a module
2020/10/22 19:41:04 Loading input failed: exit status 1
internal/service/doc.go:2: running "mockgen": exit status 1
Seems to be somewhat similar to the #423 but the proposed solution didn't work for me.
Expected behavior A clear and concise description of what you expected to
happen.
Mocks should've been generated fine.
To Reproduce Steps to reproduce the behavior
I've published a test project which can be used to reproduce the issue.
mockgen
is called during the go:generate
directive at internal/service/doc.go:
//go:generate echo $PWD - $GOPACKAGE - $GOFILE
//go:generate mockgen -package $GOPACKAGE -destination mocks_test.go github.com/nezorflame/mockgen-test/internal/client Producer
The interface to generate the mocks upon is pretty simple and is stored at internal/client/contract.go:
type Producer interface {
Produce(ctx context.Context, objects []string) error
}
So, the steps are:
- Download the project
- (Optional) Generate the mocks without the
vendor
:
a. Rungo mod tidy && go mod vendor
to clean up the dependencies
b. Rungo generate ./...
once - it'll work fine,mocks_test.go
file will be generated
c. Deletemocks_test.go
file to reproduce the error - Run
go generate ./...
- The error appears
It seems that the fact that vendor
contains dependencies somehow breaks the ability of mockgen
to generate the mocks, since the vendor-less mode works fine.
Additional Information
- gomock mode (reflect or source): reflect
- gomock version or git ref: v1.4.4
- golang version: v1.5.3
go env
output:
GO111MODULE="on"
GOARCH="amd64"
GOBIN=""
GOCACHE="/Users/nezorflame/Library/Caches/go-build"
GOENV="/Users/nezorflame/Library/Application Support/go/env"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="darwin"
GOINSECURE=""
GOMODCACHE="<my_gopath>/pkg/mod"
GONOPROXY="my.company.com"
GONOSUMDB="my.company.com"
GOOS="darwin"
GOPATH="<my_gopath>"
GOPRIVATE="my.company.com"
GOPROXY="https://proxy.golang.org,https://goproxy.io,https://gocenter.io,direct"
GOROOT="<my_goroot>"
GOSUMDB="sum.golang.org"
GOTMPDIR=""
GOTOOLDIR="<my_goroot>/pkg/tool/darwin_amd64"
GCCGO="gccgo"
AR="ar"
CC="clang"
CXX="clang++"
CGO_ENABLED="1"
GOMOD="/dev/null"
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=/var/folders/4p/q8s4q9s50qbdl5vllqg5fs000000gp/T/go-build294373709=/tmp/go-build -gno-record-gcc-switches -fno-common"