go: cmd/go: "module requires Go 1.12" error when building with Go 1.11.3 or earlier

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

Downloading: https://storage.googleapis.com/golang/go1.11.linux-amd64.tar.gz
Extracting archive
[command]/bin/tar xzC /home/vsts/work/_temp/1c8530c4-eae3-4887-a554-cae13254c039 -f /home/vsts/work/_temp/86ea4780-4861-4208-9eee-76c050c1dcec
Caching tool: go 1.11.0 x64
Prepending PATH environment variable with directory: /opt/hostedtoolcache/go/1.11.0/x64/bin

Does this issue reproduce with the latest release?

No

What operating system and processor architecture are you using (go env)?

go env Output
go1.11.linux-amd64
https://dev.azure.com/markbates/buffalo/_build/results?buildId=412

What did you do?

I rebuilt the go.mod file for gobuffalo/buffalo (https://github.com/gobuffalo/buffalo/pull/1610/files) using go1.12. In doing so it added go 1.12 to the top of the go.mod:

module github.com/gobuffalo/buffalo

go 1.12

When attempting to test this on CI with any variation of GOOS (windows, Mac, linux), go1.11 and GO111MODULES=on, I get errors telling me that module requires Go 1.12

PR: https://github.com/gobuffalo/buffalo/pull/1610/files CI: https://dev.azure.com/markbates/buffalo/_build/results?buildId=412

What did you expect to see?

I expected my tests to pass as they had previously done before the go.mod file was modified.

What did you see instead?

go build github.com/gobuffalo/buffalo/render: module requires Go 1.12
go build github.com/gobuffalo/buffalo/binding: module requires Go 1.12
go build github.com/gobuffalo/buffalo/runtime: module requires Go 1.12
go build github.com/gobuffalo/buffalo/servers: module requires Go 1.12
go build github.com/gobuffalo/buffalo/worker: module requires Go 1.12
go build github.com/gobuffalo/buffalo/binding: module requires Go 1.12
go build github.com/gobuffalo/buffalo/buffalo/cmd/destroy: module requires Go 1.12
go build github.com/gobuffalo/buffalo/packrd: module requires Go 1.12
go build github.com/gobuffalo/buffalo/genny/grift: module requires Go 1.12
go build github.com/gobuffalo/buffalo/genny/grift: module requires Go 1.12
go build github.com/gobuffalo/buffalo/grifts: module requires Go 1.12
go build github.com/gobuffalo/buffalo/mail/internal/mail: module requires Go 1.12
go build github.com/gobuffalo/buffalo/render: module requires Go 1.12
go build github.com/gobuffalo/buffalo/worker: module requires Go 1.12

About this issue

  • Original URL
  • State: closed
  • Created 5 years ago
  • Comments: 16 (9 by maintainers)

Commits related to this issue

Most upvoted comments

I think the issue is the meaning of the go directive changed, and that change was first introduced in 1.11.4 and 1.12.

I believe Go 1.11.4 and higher will build a module that contains version go 1.12 without complaint, whereas earlier 1.11 versions complain with go build github.com/me/hello: module requires Go 1.12.

https://golang.org/doc/go1.12#modules states the following:

If the go directive for a module specifies a version newer than the toolchain in use, the go command will attempt to build the packages regardless, and will note the mismatch only if that build fails.

Wouldn’t that apply in this case, meaning it should still compile with 1.11 in this case?

Here’s a short end-to-end example showing 1.11.3 fail and 1.11.4 build succesfully.

# create a .go file

$ cat <<EOF > hello.go
package main
import "fmt"
func  main() { fmt.Println("hello") }
EOF

# 'go mod init' in 1.12 sets the 'go.mod' to have  'go' directive value of '1.12'

$ go1.12 mod init github.com/me/hello
$ cat go.mod
module github.com/me/hello

go 1.12

# 1.11.3 fails when you try to build due to the 'go 1.12' in the 'go.mod'

$ go1.11.3 build
go build github.com/me/hello: module requires Go 1.12

# 1.11.4 builds same thing successfully

$ go1.11.4 build

# now force a compilation error with 1.11.4, and see extra message stating 1.12 is required
# (which will in theory be helpful in the future with Go2 changes).

$ echo "BAD COMPILE" >> hello.go

$ go1.11.4 build
# github.com/me/hello
.\hello.go:12:1: syntax error: non-declaration statement outside function body
note: module requires Go 1.12

I don’t particularly want to hack the Go 1.12 go language. I sent https://golang.org/cl/164317 to update the release notes.

What people say above is correct: when creating a module with Go 1.12, and thereby getting a go 1.12 in your go.mod file, you need to use at least Go 1.11.4 to build the module going forward. Closing because this is working as expected. I agree that this is imperfect but the only other option I see would be to delay all language changes for another six months, which seems severe.