cmd/go: when module enabled, `go clean` removes built binary

Now "go clean" can remove binary as expected, when module enabled and the module name isn't  "main" or the name of folder.

Fixes issue #41656

Change-Id: I54b9435ece045e03a12dc230efe84c8dd381a07c
GitHub-Last-Rev: f4ea2d8c76
GitHub-Pull-Request: golang/go#41999
Reviewed-on: https://go-review.googlesource.com/c/go/+/262677
Run-TryBot: Jay Conrod <jayconrod@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Jay Conrod <jayconrod@google.com>
Reviewed-by: Bryan C. Mills <bcmills@google.com>
Trust: Jay Conrod <jayconrod@google.com>
Trust: Bryan C. Mills <bcmills@google.com>
This commit is contained in:
hitzhangjie 2020-10-21 05:09:26 +00:00 committed by Jay Conrod
parent 3bac5faa4a
commit 9c28a50fd1
2 changed files with 94 additions and 2 deletions

View File

@ -276,6 +276,8 @@ func clean(p *load.Package) {
allRemove = append(allRemove,
elem,
elem+".exe",
p.DefaultExecName(),
p.DefaultExecName()+".exe",
)
}
@ -283,16 +285,28 @@ func clean(p *load.Package) {
allRemove = append(allRemove,
elem+".test",
elem+".test.exe",
p.DefaultExecName()+".test",
p.DefaultExecName()+".test.exe",
)
// Remove a potential executable for each .go file in the directory that
// Remove a potential executable, test executable for each .go file in the directory that
// is not part of the directory's package.
for _, dir := range dirs {
name := dir.Name()
if packageFile[name] {
continue
}
if !dir.IsDir() && strings.HasSuffix(name, ".go") {
if dir.IsDir() {
continue
}
if strings.HasSuffix(name, "_test.go") {
base := name[:len(name)-len("_test.go")]
allRemove = append(allRemove, base+".test", base+".test.exe")
}
if strings.HasSuffix(name, ".go") {
// TODO(adg,rsc): check that this .go file is actually
// in "package main", and therefore capable of building
// to an executable file.

View File

@ -0,0 +1,78 @@
# Build something to create the executable, including several cases
[short] skip
# --------------------- clean executables -------------------------
# case1: test file-named executable 'main'
env GO111MODULE=on
! exists main$GOEXE
go build main.go
exists -exec main$GOEXE
go clean
! exists main$GOEXE
# case2: test module-named executable 'a.b.c'
! exists a.b.c$GOEXE
go build
exists -exec a.b.c$GOEXE
go clean
! exists a.b.c$GOEXE
# case3: directory-named executable 'src'
env GO111MODULE=off
! exists src$GOEXE
go build
exists -exec src$GOEXE
go clean
! exists src$GOEXE
# --------------------- clean test files -------------------------
# case1: test file-named test file
env GO111MODULE=on
! exists main.test$GOEXE
go test -c main_test.go
exists -exec main.test$GOEXE
go clean
! exists main.test$GOEXE
# case2: test module-named test file
! exists a.b.c.test$GOEXE
go test -c
exists -exec a.b.c.test$GOEXE
go clean
! exists a.b.c.test$GOEXE
# case3: test directory-based test file
env GO111MODULE=off
! exists src.test$GOEXE
go test -c
exists -exec src.test$GOEXE
go clean
! exists src.test$GOEXE
-- main.go --
package main
import "fmt"
func main() {
fmt.Println("hello!")
}
-- main_test.go --
package main
import "testing"
func TestSomething(t *testing.T) {
}
-- go.mod --
module example.com/a.b.c/v2
go 1.12