mirror of https://github.com/golang/go.git
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:
parent
d05e89a8fd
commit
5f616a6fe7
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
Loading…
Reference in New Issue