Skip to content

cmd/go: 'go build' sets arbitrary requirement of module name containing dots #27503

Closed
@shoenig

Description

@shoenig

All of my dependent modules are in order, and none of them have a hostname prefix that contain dots. The convention we have been using for years with GOPATH is "company/foo/bar", rather than "our.company.com/foo/bar".

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

$ go version
go version go1.11 linux/amd64

What did you do?

Built a proxy which can be used to serve up modules which reflect our real world, which is a world with custom import paths with no "hostname" prefix. Trying to use go build with this proxy and our modules results in the go build command complaining that our modules do not start with a "hostname" prefix, because the first path element in our modules do not contain any dot characters.

First, a view of the modules being served by our proxy

[k9 modprox-modules] $ tree
.
└── indeed
    └── gophers
        ├── 3rdparty
        │   └── p
        │       └── github.com
        │           ├── pkg
        │           │   └── errors
        │           │       ├── v0.0.1.info
        │           │       ├── v0.0.1.mod
        │           │       └── v0.0.1.zip
        │           └── stretchr
        │               └── testify
        │                   ├── assert
        │                   │   ├── v0.0.1.info
        │                   │   ├── v0.0.1.mod
        │                   │   └── v0.0.1.zip
        │                   ├── require
        │                   │   ├── v0.0.1.info
        │                   │   ├── v0.0.1.mod
        │                   │   └── v0.0.1.zip
        │                   └── suite
        │                       ├── v0.0.1.info
        │                       ├── v0.0.1.mod
        │                       └── v0.0.1.zip
        ├── libconfig
        │   ├── v0.0.1.info
        │   ├── v0.0.1.mod
        │   └── v0.0.1.zip
        └── libtest
            ├── v0.0.1.info
            ├── v0.0.1.mod
            └── v0.0.1.zip

14 directories, 18 files

This seems like a reasonable module structure.

A peek at the go.mod file we are about to use:

$ cat go.mod
module indeed/gophers/libconfig

require (
	indeed/gophers/3rdparty/p/github.com/pkg/errors v0.0.1
	indeed/gophers/3rdparty/p/github.com/stretchr/testify/assert v0.0.1 // indirect
	indeed/gophers/3rdparty/p/github.com/stretchr/testify/require v0.0.1
	indeed/gophers/3rdparty/p/github.com/stretchr/testify/suite v0.0.1 // indirect
	indeed/gophers/libtest v0.0.1
)

Lines up fine with the modules being served from the proxy.

Okay let's build it

 $ echo $GOPROXY
http://localhost:12505

$ go build
go: indeed/gophers/3rdparty/p/github.com/stretchr/testify/[email protected]: unrecognized import path "indeed/gophers/3rdparty/p/github.com/stretchr/testify/require" (import path does not begin with hostname)
go: indeed/gophers/[email protected]: unrecognized import path "indeed/gophers/libtest" (import path does not begin with hostname)
go: indeed/gophers/3rdparty/p/github.com/pkg/[email protected]: unrecognized import path "indeed/gophers/3rdparty/p/github.com/pkg/errors" (import path does not begin with hostname)
go: indeed/gophers/3rdparty/p/github.com/stretchr/testify/[email protected]: unrecognized import path "indeed/gophers/3rdparty/p/github.com/stretchr/testify/suite" (import path does not begin with hostname)
go: indeed/gophers/3rdparty/p/github.com/stretchr/testify/[email protected]: unrecognized import path "indeed/gophers/3rdparty/p/github.com/stretchr/testify/assert" (import path does not begin with hostname)
go: error loading module requirements

Hmm, that's not useful. The go build command is enforcing import paths to begin with a path element that contains dot characters. This seems totally arbitrary (at least in the context of GOPROXY) and breaks at least this one real world use case (a fix on our end would be "atomically" updating hundreds of repositories and interrupting dozens of developer workflows).

It seems to me at least with GOPROXY set, go build should just trust that the module will be resolvable.

Metadata

Metadata

Assignees

No one assigned

    Labels

    FrozenDueToAgeNeedsDecisionFeedback is required from experts, contributors, and/or the community before a change can be made.modules

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions