cmd/go: in 'go mod init', suggest running 'go mod tidy'

When 'go mod init' is run in an existing project, it may import
requirements from a vendor configuration file, but the requirements
may not be complete, and go.sum won't contain sums for module
zips. With -mod=readonly, the next build command is likely to fail.

'go mod init' will now suggest running 'go mod tidy' if there are .go
files or subdirectories in the current directory.

We could potentially run 'go mod tidy' automatically within
'go mod init', but it seems better to guide users to using 'go mod tidy'
as a separate command to fix missing dependencies.

For #41712
Updates #40278

Change-Id: Iaece607f291244588a732ef4c5d576108965ca91
Reviewed-on: https://go-review.googlesource.com/c/go/+/264622
Trust: Jay Conrod <jayconrod@google.com>
Run-TryBot: Jay Conrod <jayconrod@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Bryan C. Mills <bcmills@google.com>
This commit is contained in:
Jay Conrod 2020-10-23 11:10:10 -04:00
parent d05e89a8fd
commit 5f616a6fe7
2 changed files with 53 additions and 0 deletions

View File

@ -435,6 +435,29 @@ func CreateModFile(ctx context.Context, modPath string) {
modFileToBuildList()
WriteGoMod()
// Suggest running 'go mod tidy' unless the project is empty. Even if we
// imported all the correct requirements above, we're probably missing
// some sums, so the next build command in -mod=readonly will likely fail.
//
// We look for non-hidden .go files or subdirectories to determine whether
// this is an existing project. Walking the tree for packages would be more
// accurate, but could take much longer.
empty := true
fis, _ := ioutil.ReadDir(modRoot)
for _, fi := range fis {
name := fi.Name()
if strings.HasPrefix(name, ".") || strings.HasPrefix(name, "_") {
continue
}
if strings.HasSuffix(name, ".go") || fi.IsDir() {
empty = false
break
}
}
if !empty {
fmt.Fprintf(os.Stderr, "go: run 'go mod tidy' to add module requirements and sums\n")
}
}
// checkModulePathLax checks that the path meets some minimum requirements

View File

@ -0,0 +1,30 @@
# 'go mod init' should not recommend 'go mod tidy' in an empty directory
# (one that contains no non-hidden .go files or subdirectories).
cd empty
go mod init m
! stderr tidy
cd ..
# 'go mod init' should recommend 'go mod tidy' if the directory has a .go file.
cd pkginroot
go mod init m
stderr '^go: run ''go mod tidy'' to add module requirements and sums$'
cd ..
# 'go mod init' should recommend 'go mod tidy' if the directory has a
# subdirectory. We don't walk the tree to see if it has .go files.
cd subdir
go mod init m
stderr '^go: run ''go mod tidy'' to add module requirements and sums$'
cd ..
-- empty/empty.txt --
Not a .go file. Still counts as an empty project.
-- empty/.hidden/empty.go --
File in hidden directory. Still as an empty project.
-- empty/_hidden/empty.go --
File in hidden directory. Still as an empty project.
-- pkginroot/hello.go --
package vendorimport
-- subdir/sub/empty.txt --
Subdirectory doesn't need to contain a package.