src/cmd/go/internal/modcmd/tidy.go | 1 + src/cmd/go/internal/modcmd/vendor.go | 1 + src/cmd/go/internal/modload/init.go | 6 ++++++ src/cmd/go/internal/modload/load.go | 5 +++++ src/cmd/go/testdata/script/mod_tidy_error.txt | 4 ++-- diff --git a/src/cmd/go/internal/modcmd/tidy.go b/src/cmd/go/internal/modcmd/tidy.go index af2b04c0c20381ec72b0903df3d50b53c695f800..5ff847485cbedfa24621ad9265b6fa733f8c58ae 100644 --- a/src/cmd/go/internal/modcmd/tidy.go +++ b/src/cmd/go/internal/modcmd/tidy.go @@ -42,6 +42,7 @@ if len(args) > 0 { base.Fatalf("go mod tidy: no arguments allowed") } + modload.SilenceMissingStdImports = true modload.LoadALL() modload.TidyBuildList() modTidyGoSum() // updates memory copy; WriteGoMod on next line flushes it out diff --git a/src/cmd/go/internal/modcmd/vendor.go b/src/cmd/go/internal/modcmd/vendor.go index 8509ceb7a8b948fab8a83bc1a00415e4ae955c5b..5a5bb943a5837a72b614509e19b60dbfa298a0d3 100644 --- a/src/cmd/go/internal/modcmd/vendor.go +++ b/src/cmd/go/internal/modcmd/vendor.go @@ -47,6 +47,7 @@ func runVendor(cmd *base.Command, args []string) { if len(args) != 0 { base.Fatalf("go mod vendor: vendor takes no arguments") } + modload.SilenceMissingStdImports = true pkgs := modload.LoadVendor() vdir := filepath.Join(modload.ModRoot(), "vendor") diff --git a/src/cmd/go/internal/modload/init.go b/src/cmd/go/internal/modload/init.go index 664a2a15943abcae1cb6b389393fb58e087ac29d..2360feef045f8e89ef29830ced60d6665832d549 100644 --- a/src/cmd/go/internal/modload/init.go +++ b/src/cmd/go/internal/modload/init.go @@ -56,6 +56,12 @@ CmdModInit bool // running 'go mod init' CmdModModule string // module argument for 'go mod init' allowMissingModuleImports bool + + // SilenceMissingStdImports indicates that LoadALL should not print an error + // or terminate the process if an imported package is missing, and the import + // path looks like it might be in the standard library (perhaps in a future + // Go version). + SilenceMissingStdImports bool ) // ModFile returns the parsed go.mod file. diff --git a/src/cmd/go/internal/modload/load.go b/src/cmd/go/internal/modload/load.go index 30992e0cc233efac2bbd8e7936fc6eaff3eb6dff..e5ea1a6c238b302bd4681967783d2336e563e48c 100644 --- a/src/cmd/go/internal/modload/load.go +++ b/src/cmd/go/internal/modload/load.go @@ -433,6 +433,11 @@ var paths []string for _, pkg := range loaded.pkgs { if pkg.err != nil { + if impErr := (*ImportMissingError)(nil); SilenceMissingStdImports && + errors.As(pkg.err, &impErr) && + search.IsStandardImportPath(impErr.Path) { + continue + } base.Errorf("%s: %v", pkg.stackText(), pkg.err) continue } diff --git a/src/cmd/go/testdata/script/mod_tidy_error.txt b/src/cmd/go/testdata/script/mod_tidy_error.txt index b6c24ceaf75f245436a0d457fe3aea702050e8e1..395537b1a7177917d95805970163b3c7ff12edd3 100644 --- a/src/cmd/go/testdata/script/mod_tidy_error.txt +++ b/src/cmd/go/testdata/script/mod_tidy_error.txt @@ -4,12 +4,12 @@ # Regression test for golang.org/issue/27063: # 'go mod tidy' and 'go mod vendor' should not hide loading errors. ! go mod tidy -stderr '^issue27063 imports\n\tnonexist: package nonexist is not in GOROOT \(.*\)' +! stderr 'package nonexist is not in GOROOT' stderr '^issue27063 imports\n\tnonexist.example.com: cannot find module providing package nonexist.example.com' stderr '^issue27063 imports\n\tissue27063/other imports\n\tother.example.com/nonexist: cannot find module providing package other.example.com/nonexist' ! go mod vendor -stderr '^issue27063 imports\n\tnonexist: package nonexist is not in GOROOT \(.*\)' +! stderr 'package nonexist is not in GOROOT' stderr '^issue27063 imports\n\tnonexist.example.com: cannot find module providing package nonexist.example.com' stderr '^issue27063 imports\n\tissue27063/other imports\n\tother.example.com/nonexist: cannot find module providing package other.example.com/nonexist'