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() {
--- /dev/null
+[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'''