diff options
author | Jay Conrod <jayconrod@google.com> | 2019-10-02 17:51:54 -0400 |
---|---|---|
committer | Jay Conrod <jayconrod@google.com> | 2019-10-09 23:03:55 +0000 |
commit | 3322f3e0ce6e8a8bbdd8e17803887a1f7119a52e (patch) | |
tree | c14474090c4761c28311893488c6a85aaf78e332 /src/cmd/go/testdata/script/mod_outside.txt | |
parent | aa09e751ff8e1adeebbd4dcd562e998b33d1b4fa (diff) | |
download | go-3322f3e0ce6e8a8bbdd8e17803887a1f7119a52e.tar.gz go-3322f3e0ce6e8a8bbdd8e17803887a1f7119a52e.zip |
cmd/go: forbid resolving import to modules when outside of a module
When in module mode outside of any module, 'go build' and most other
commands will now report an error instead of resolving a package path
to a module.
Previously, most commands would attempt to find the latest version of
a module providing the package. This could be very slow if many
packages needed to be resolved this way. Since there is no go.mod file
where module requirements can be saved, it's a repeatedly slow and
confusing experience.
After this change, 'go build' and other commands may still be used
outside of a module on packages in std and source files (.go
arguments) that only import packages in std. Listing any other package
on the command line or importing a package outside std will cause an
error.
'go get' is exempted from the new behavior, since it's expected that
'go get' resolves paths to modules at new versions.
Updates #32027
Change-Id: Ia9d3a3b4ad738ca5423472e17818d62b96a2c959
Reviewed-on: https://go-review.googlesource.com/c/go/+/198778
Run-TryBot: Jay Conrod <jayconrod@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Bryan C. Mills <bcmills@google.com>
Diffstat (limited to 'src/cmd/go/testdata/script/mod_outside.txt')
-rw-r--r-- | src/cmd/go/testdata/script/mod_outside.txt | 118 |
1 files changed, 86 insertions, 32 deletions
diff --git a/src/cmd/go/testdata/script/mod_outside.txt b/src/cmd/go/testdata/script/mod_outside.txt index 4182e71dde..dd4e2d5800 100644 --- a/src/cmd/go/testdata/script/mod_outside.txt +++ b/src/cmd/go/testdata/script/mod_outside.txt @@ -17,7 +17,7 @@ go list -m stdout '^command-line-arguments$' # 'go list' in the working directory should fail even if there is a a 'package # main' present: without a main module, we do not know its package path. -! go list ./foo +! go list ./needmod stderr 'cannot find main module' # 'go list all' lists the transitive import graph of the main module, @@ -38,7 +38,7 @@ go list $GOROOT/src/fmt stdout '^fmt$' # 'go list' should work with file arguments. -go list ./foo/foo.go +go list ./needmod/needmod.go stdout 'command-line-arguments' # 'go list -m' with an explicit version should resolve that version. @@ -104,7 +104,7 @@ stdout 'all modules verified' stderr 'cannot find main module' ! go get -u stderr 'cannot find main module' -! go get -u ./foo +! go get -u ./needmod stderr 'cannot find main module' # 'go get -u all' upgrades the transitive import graph of the main module, @@ -126,35 +126,75 @@ exists $GOPATH/pkg/mod/example.com/version@v1.0.0 # 'go build' without arguments implicitly operates on the current directory, and should fail. -cd foo +cd needmod ! go build stderr 'cannot find main module' cd .. # 'go build' of a non-module directory should fail too. -! go build ./foo +! go build ./needmod stderr 'cannot find main module' -# However, 'go build' should succeed for standard-library packages. +# 'go build' of source files should fail if they import anything outside std. +! go build -n ./needmod/needmod.go +stderr 'needmod[/\\]needmod.go:10:2: cannot find module providing package example.com/version: working directory is not part of a module' + +# 'go build' of source files should succeed if they do not import anything outside std. +go build -n -o ignore ./stdonly/stdonly.go + +# 'go build' should succeed for standard-library packages. go build -n fmt -# TODO(golang.org/issue/28992): 'go doc' should document the latest version. -# For now it does not. +# 'go doc' without arguments implicitly operates on the current directory, and should fail. +# TODO(golang.org/issue/32027): currently, it succeeds. +cd needmod +go doc +cd .. + +# 'go doc' of a non-module directory should also succeed. +go doc ./needmod + +# 'go doc' should succeed for standard-library packages. +go doc fmt + +# 'go doc' should fail for a package path outside a module. ! go doc example.com/version -stderr 'no such package' +stderr 'doc: cannot find module providing package example.com/version: working directory is not part of a module' # 'go install' with a version should fail due to syntax. ! go install example.com/printversion@v1.0.0 stderr 'can only use path@version syntax with' +# 'go install' should fail if a package argument must be resolved to a module. +! go install example.com/printversion +stderr 'cannot find module providing package example.com/printversion: working directory is not part of a module' + +# 'go install' should fail if a source file imports a package that must be +# resolved to a module. +! go install ./needmod/needmod.go +stderr 'needmod[/\\]needmod.go:10:2: cannot find module providing package example.com/version: working directory is not part of a module' + + +# 'go run' with a verison should fail due to syntax. +! go run example.com/printversion@v1.0.0 +stderr 'can only use path@version syntax with' + +# 'go run' should fail if a package argument must be resolved to a module. +! go run example.com/printversion +stderr 'cannot find module providing package example.com/printversion: working directory is not part of a module' + +# 'go run' should fail if a source file imports a package that must be +# resolved to a module. +! go run ./needmod/needmod.go +stderr 'needmod[/\\]needmod.go:10:2: cannot find module providing package example.com/version: working directory is not part of a module' + # 'go fmt' should be able to format files outside of a module. -go fmt foo/foo.go +go fmt needmod/needmod.go # The remainder of the test checks dependencies by linking and running binaries. -[short] stop # 'go get' of a binary without a go.mod should install the requested version, # resolving outside dependencies to the latest available versions. @@ -180,39 +220,31 @@ stdout 'path is example.com/printversion' stdout 'main is example.com/printversion v1.0.0' stdout 'using example.com/version v1.0.1' -# 'go install' without a version should install the latest version -# using its minimal module requirements. -go install example.com/printversion -exec ../bin/printversion -stdout 'path is example.com/printversion' -stdout 'main is example.com/printversion v1.0.0' -stdout 'using example.com/version v1.0.0' - -# 'go run' should use 'main' as the effective module and import path. -go run ./foo/foo.go +# 'go run' should work with file arguments if they don't import anything +# outside std. +go run ./stdonly/stdonly.go stdout 'path is command-line-arguments$' stdout 'main is command-line-arguments \(devel\)' -stdout 'using example.com/version v1.1.0' # 'go generate' should work with file arguments. -[exec:touch] go generate ./foo/foo.go -[exec:touch] exists ./foo/gen.txt +[exec:touch] go generate ./needmod/needmod.go +[exec:touch] exists ./needmod/gen.txt # 'go install' should work with file arguments. -go install ./foo/foo.go +go install ./stdonly/stdonly.go # 'go test' should work with file arguments. -go test -v ./foo/foo_test.go -stdout 'foo was tested' +go test -v ./stdonly/stdonly_test.go +stdout 'stdonly was tested' # 'go vet' should work with file arguments. -go vet ./foo/foo.go +go vet ./stdonly/stdonly.go -- README.txt -- There is no go.mod file in the working directory. --- foo/foo.go -- +-- needmod/needmod.go -- //go:generate touch gen.txt package main @@ -237,7 +269,28 @@ func main() { } } --- foo/foo_test.go -- +-- stdonly/stdonly.go -- +package main + +import ( + "fmt" + "os" + "runtime/debug" +) + +func main() { + info, ok := debug.ReadBuildInfo() + if !ok { + panic("missing build info") + } + fmt.Fprintf(os.Stdout, "path is %s\n", info.Path) + fmt.Fprintf(os.Stdout, "main is %s %s\n", info.Main.Path, info.Main.Version) + for _, m := range info.Deps { + fmt.Fprintf(os.Stdout, "using %s %s\n", m.Path, m.Version) + } +} + +-- stdonly/stdonly_test.go -- package main import ( @@ -245,6 +298,7 @@ import ( "testing" ) -func TestFoo(t *testing.T) { - fmt.Println("foo was tested") +func Test(t *testing.T) { + fmt.Println("stdonly was tested") } + |