Go: cmd/go: no helpful error message for "no Go files" with modules

Created on 21 Aug 2018  ยท  8Comments  ยท  Source: golang/go

Without modules, the go tool informs me that I'm trying to build a package with no Go files:

$ go1.11rc1 build ./vcs-test
can't load package: package golang.org/x/build/vcs-test: no Go files in /Users/filippo/src/golang.org/x/build/vcs-test

With modules, I get an obscure error:

$ GO111MODULE=on go1.11rc1 build ./vcs-test
go: finding golang.org/x/build/vcs-test latest
can't load package: package golang.org/x/build/vcs-test: unknown import path "golang.org/x/build/vcs-test": cannot find module providing package golang.org/x/build/vcs-test
FrozenDueToAge NeedsInvestigation modules

Most helpful comment

Note that this relatively unhelpful error message still occurs with 1.11.4 and 1.12beta1.

# Failing example. There are no .go files (and hence no package) in the same directory 
# as the main `go.mod` file.

mkdir -p /tmp/scratchpad/bitbucket-module-bad
cd /tmp/scratchpad/bitbucket-module-bad
go mod init bitbucket.org/foo/bar

mkdir baz
cat <<EOF > baz/baz.go
package baz

func Hello() string { return "Hello from bitbucket.org/foo/bar/baz" }
EOF

cd /tmp/scratchpad/bitbucket-module-bad
go build -v 

Fails with:

$ go build -v
Fetching https://bitbucket.org?go-get=1
Parsing meta tags from https://bitbucket.org?go-get=1 (status code 200)
can't load package: package bitbucket.org/foo/bar: unknown import path "bitbucket.org/foo/bar": 
cannot find module providing package bitbucket.org/foo/bar

One solution (as covered in an FAQ on the modules wiki) is go build ./... or other variations.

CC @myitcv @bcmills @heschik

All 8 comments

Note that this relatively unhelpful error message still occurs with 1.11.4 and 1.12beta1.

# Failing example. There are no .go files (and hence no package) in the same directory 
# as the main `go.mod` file.

mkdir -p /tmp/scratchpad/bitbucket-module-bad
cd /tmp/scratchpad/bitbucket-module-bad
go mod init bitbucket.org/foo/bar

mkdir baz
cat <<EOF > baz/baz.go
package baz

func Hello() string { return "Hello from bitbucket.org/foo/bar/baz" }
EOF

cd /tmp/scratchpad/bitbucket-module-bad
go build -v 

Fails with:

$ go build -v
Fetching https://bitbucket.org?go-get=1
Parsing meta tags from https://bitbucket.org?go-get=1 (status code 200)
can't load package: package bitbucket.org/foo/bar: unknown import path "bitbucket.org/foo/bar": 
cannot find module providing package bitbucket.org/foo/bar

One solution (as covered in an FAQ on the modules wiki) is go build ./... or other variations.

CC @myitcv @bcmills @heschik

29268 is related.

I have been writing Go (it was the first language I really learned well) and so ./... seemed normal to me, but I was recently helping a very experienced C# engineer on board onto my team. We were pair-programming and we came across this issue and I used go install ./... and he was a little weirded out but thought it was easy to remember but was unintuitive.

Perhaps ./... could be the default if GO111MODULE=on or there's a go.mod file in the current directory?

Failing that, the error message could use some work. can't load package: package projectname: unknown import path "projectname": cannot find module providing package projectname doesn't suggest to me "You forgot to specify which module to compile, maybe with ./...".

31270 might be a dup of this.

I was following a tutorial for something (gRPC) and the tutorial makes use of modules, so I got to learn about them too \o/

However I had an issue where I had made a mistake and the error message from go build was not very helpful.

Below is pasted the file tree, the root go.mod, the code that was generating the error, the command being executed and the error message. The error turned out to be that the import path was pointed at a directory with no go source files, but the error reported was "cannot find module providing package"

.
.
โ”œโ”€โ”€ go.mod
โ”œโ”€โ”€ go.sum
โ””โ”€โ”€ part_1
    โ”œโ”€โ”€ api
    โ”‚   โ””โ”€โ”€ proto
    โ”‚       โ””โ”€โ”€ v1
    โ”‚           โ””โ”€โ”€ todo-service.proto
    โ”œโ”€โ”€ cmd
    โ”‚   โ”œโ”€โ”€ client-grpc
    โ”‚   โ”‚   โ”œโ”€โ”€ client-grpc
    โ”‚   โ”‚   โ””โ”€โ”€ main.go
    โ”‚   โ””โ”€โ”€ server
    โ”‚       โ””โ”€โ”€ main.go
    โ”œโ”€โ”€ create_todo_table.sql
    โ”œโ”€โ”€ go.sum
    โ”œโ”€โ”€ pkg
    โ”‚   โ”œโ”€โ”€ api
    โ”‚   โ”‚   โ””โ”€โ”€ v1
    โ”‚   โ”‚       โ””โ”€โ”€ todo-service.pb.go
    โ”‚   โ”œโ”€โ”€ cmd
    โ”‚   โ”‚   โ””โ”€โ”€ server
    โ”‚   โ”‚       โ””โ”€โ”€ server.go
    โ”‚   โ”œโ”€โ”€ protocol
    โ”‚   โ”‚   โ””โ”€โ”€ grpc
    โ”‚   โ”‚       โ””โ”€โ”€ server.go
    โ”‚   โ””โ”€โ”€ service
    โ”‚       โ””โ”€โ”€ v1
    โ”‚           โ”œโ”€โ”€ todo-service.go
    โ”‚           โ””โ”€โ”€ todo-service_test.go
    โ””โ”€โ”€ third_party
        โ””โ”€โ”€ google
            โ””โ”€โ”€ protobuf
                โ”œโ”€โ”€ any.proto
                โ”œโ”€โ”€ api.proto
                โ”œโ”€โ”€ compiler
                โ”‚   โ””โ”€โ”€ plugin.proto
                โ”œโ”€โ”€ descriptor.proto
                โ”œโ”€โ”€ duration.proto
                โ”œโ”€โ”€ empty.proto
                โ”œโ”€โ”€ field_mask.proto
                โ”œโ”€โ”€ source_context.proto
                โ”œโ”€โ”€ struct.proto
                โ”œโ”€โ”€ timestamp.proto
                โ”œโ”€โ”€ type.proto
                โ””โ”€โ”€ wrappers.proto

20 directories, 25 files
=======================================
~/go/src/shane/go.mod
module shane

require (
    github.com/DATA-DOG/go-sqlmock v1.3.3
    github.com/go-sql-driver/mysql v1.4.1
    github.com/golang/protobuf v1.3.1
    google.golang.org/grpc v1.21.0
)
========================================
~/go/src/shane/part_1/cmd/server
package main

import (
    "fmt"
    "os"

    "shane/part_1/pkg/cmd"
)

func main() {
    if err := cmd.RunServer(); err != nil {
        fmt.Fprintf(os.Stderr, "%v\n", err)
        os.Exit(1)
    }
}
========================================
go build . # inside ~/go/src/shane/part_1/cmd/server
main.go:7:2: unknown import path "shane/part_1/pkg/cmd": cannot find module providing package shane/part_1/pkg/cmd

Change https://golang.org/cl/185345 mentions this issue: cmd/go: rationalize errors in internal/load and internal/modload

This appears to be fixed at head.

~/src/golang.org/x/build$ gotip version
go version devel +0915a19a Fri Dec 6 05:12:15 2019 +0000 linux/amd64

~/src/golang.org/x/build$ GO111MODULE=on gotip build ./vcs-test
can't load package: package ./vcs-test: no Go files in /usr/local/google/home/bcmills/src/golang.org/x/build/vcs-test

~/src/golang.org/x/build$ GO111MODULE=off gotip build ./vcs-test
can't load package: package golang.org/x/build/vcs-test: no Go files in /usr/local/google/home/bcmills/src/golang.org/x/build/vcs-test

Was this page helpful?
0 / 5 - 0 ratings