From 15a94b4331c8aecd493b05617564df531881908d Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Wed, 24 Sep 2025 19:40:49 +0200 Subject: [PATCH] build: module-aware FindMainPackages (#32736) This fixes `go run build/ci.go install`. It was failing because we resolved all main packages by parsing sources, which fails when the source directory contains multiple modules. --- build/ci.go | 2 +- internal/build/util.go | 32 ++++++++++---------------------- 2 files changed, 11 insertions(+), 23 deletions(-) diff --git a/build/ci.go b/build/ci.go index c5d522c0e6..c6f4f28c87 100644 --- a/build/ci.go +++ b/build/ci.go @@ -221,7 +221,7 @@ func doInstall(cmdline []string) { // Default: collect all 'main' packages in cmd/ and build those. packages := flag.Args() if len(packages) == 0 { - packages = build.FindMainPackages("./cmd") + packages = build.FindMainPackages(&tc, "./cmd/...") } // Do the build! diff --git a/internal/build/util.go b/internal/build/util.go index 27531d3d95..6e6632c750 100644 --- a/internal/build/util.go +++ b/internal/build/util.go @@ -21,8 +21,6 @@ import ( "bytes" "flag" "fmt" - "go/parser" - "go/token" "io" "log" "os" @@ -219,28 +217,18 @@ func UploadSFTP(identityFile, host, dir string, files []string) error { // FindMainPackages finds all 'main' packages in the given directory and returns their // package paths. -func FindMainPackages(dir string) []string { - var commands []string - cmds, err := os.ReadDir(dir) +func FindMainPackages(tc *GoToolchain, pattern string) []string { + list := tc.Go("list", "-f", `{{if eq .Name "main"}}{{.ImportPath}}{{end}}`, pattern) + output, err := list.Output() if err != nil { - log.Fatal(err) + log.Fatal("go list failed:", err) } - for _, cmd := range cmds { - pkgdir := filepath.Join(dir, cmd.Name()) - if !cmd.IsDir() { - continue - } - pkgs, err := parser.ParseDir(token.NewFileSet(), pkgdir, nil, parser.PackageClauseOnly) - if err != nil { - log.Fatal(err) - } - for name := range pkgs { - if name == "main" { - path := "./" + filepath.ToSlash(pkgdir) - commands = append(commands, path) - break - } + var result []string + for l := range bytes.Lines(output) { + l = bytes.TrimSpace(l) + if len(l) > 0 { + result = append(result, string(l)) } } - return commands + return result }