From 254fb85c12aa631b5d1596aaf13f6e8666d65d15 Mon Sep 17 00:00:00 2001 From: Jay Conrod Date: Mon, 29 Mar 2021 17:00:15 -0400 Subject: [PATCH] cmd/go: print deprecation notice for 'go get cmd' The notice is shown when 'go get' is invoked with the -d flag, and the arguments match at least one main package. This reverts CL 274552. For #43684 Change-Id: I42e6731455f22988bf72dde1d5a76d197e9e3954 Reviewed-on: https://go-review.googlesource.com/c/go/+/305670 Trust: Jay Conrod Run-TryBot: Jay Conrod TryBot-Result: Go Bot Reviewed-by: Michael Matloob --- src/cmd/go/internal/modget/get.go | 28 +++++++++++++++++-- .../script/mod_get_deprecate_install.txt | 22 +++++++++++++++ 2 files changed, 47 insertions(+), 3 deletions(-) create mode 100644 src/cmd/go/testdata/script/mod_get_deprecate_install.txt diff --git a/src/cmd/go/internal/modget/get.go b/src/cmd/go/internal/modget/get.go index a9447f6c57..c6e380b197 100644 --- a/src/cmd/go/internal/modget/get.go +++ b/src/cmd/go/internal/modget/get.go @@ -385,10 +385,32 @@ func runGet(ctx context.Context, cmd *base.Command, args []string) { pkgs = append(pkgs, pkg) } load.CheckPackageErrors(pkgs) + + haveExe := false + for _, pkg := range pkgs { + if pkg.Name == "main" { + haveExe = true + break + } + } + if haveExe { + fmt.Fprint(os.Stderr, "go get: installing executables with 'go get' in module mode is deprecated.") + var altMsg string + if modload.HasModRoot() { + altMsg = ` + To adjust and download dependencies of the current module, use 'go get -d'. + To install using requirements of the current module, use 'go install'. + To install ignoring the current module, use 'go install' with a version, + like 'go install example.com/cmd@latest'. +` + } else { + altMsg = "\n\tUse 'go install pkg@version' instead.\n" + } + fmt.Fprint(os.Stderr, altMsg) + fmt.Fprintf(os.Stderr, "\tFor more information, see https://golang.org/doc/go-get-install-deprecation\n\tor run 'go help get' or 'go help install'.\n") + } + work.InstallPackages(ctx, pkgPatterns, pkgs) - // TODO(#40276): After Go 1.16, print a deprecation notice when building and - // installing main packages. 'go install pkg' or 'go install pkg@version' - // should be used instead. Give the specific argument to use if possible. } if !modload.HasModRoot() { diff --git a/src/cmd/go/testdata/script/mod_get_deprecate_install.txt b/src/cmd/go/testdata/script/mod_get_deprecate_install.txt new file mode 100644 index 0000000000..d832b5f2e8 --- /dev/null +++ b/src/cmd/go/testdata/script/mod_get_deprecate_install.txt @@ -0,0 +1,22 @@ +[short] skip + +env GO111MODULE=on + +# 'go get' outside a module with an executable prints a deprecation message. +go get example.com/cmd/a +stderr '^go get: installing executables with ''go get'' in module mode is deprecated.$' +stderr 'Use ''go install pkg@version'' instead.' + + +go mod init m + +# 'go get' inside a module with a non-main package does not print a message. +# This will stop building in the future, but it's the command we want to use. +go get rsc.io/quote +! stderr deprecated + +# 'go get' inside a module with an executable prints a different +# deprecation message. +go get example.com/cmd/a +stderr '^go get: installing executables with ''go get'' in module mode is deprecated.$' +stderr 'To adjust and download dependencies of the current module, use ''go get -d''' -- 2.48.1