| [short] skip |
| |
| # go/build's Import should find modules by invoking the go command |
| |
| go build -o $WORK ./testimport ./testfindonly |
| |
| # GO111MODULE=off |
| env GO111MODULE=off |
| ! exec $WORK/testimport$GOEXE gobuild.example.com/x/y/z/w . |
| |
| # GO111MODULE=auto in GOPATH/src |
| env GO111MODULE=auto |
| exec $WORK/testimport$GOEXE gobuild.example.com/x/y/z/w . |
| |
| # GO111MODULE=auto outside GOPATH/src |
| cd $GOPATH/other |
| env GO111MODULE=auto |
| exec $WORK/testimport$GOEXE other/x/y/z/w . |
| stdout w2.go |
| |
| ! exec $WORK/testimport$GOEXE gobuild.example.com/x/y/z/w . |
| stderr 'cannot find module providing package gobuild.example.com/x/y/z/w' |
| |
| cd z |
| exec $WORK/testimport$GOEXE other/x/y/z/w . |
| stdout w2.go |
| |
| # GO111MODULE=on outside GOPATH/src |
| env GO111MODULE= |
| exec $WORK/testimport$GOEXE other/x/y/z/w . |
| stdout w2.go |
| env GO111MODULE=on |
| exec $WORK/testimport$GOEXE other/x/y/z/w . |
| stdout w2.go |
| |
| # GO111MODULE=on in GOPATH/src |
| cd $GOPATH/src |
| env GO111MODULE= |
| exec $WORK/testimport$GOEXE gobuild.example.com/x/y/z/w . |
| stdout w1.go |
| env GO111MODULE=on |
| exec $WORK/testimport$GOEXE gobuild.example.com/x/y/z/w . |
| stdout w1.go |
| cd w |
| exec $WORK/testimport$GOEXE gobuild.example.com/x/y/z/w .. |
| stdout w1.go |
| |
| # go/build's Import in FindOnly mode should find directories by invoking the go command |
| # |
| # Calling build.Import in build.FindOnly mode on an import path of a Go package |
| # that produces errors when loading (e.g., due to build constraints not matching |
| # the current build context) should return the package directory and nil error. |
| |
| # Issue 31603: Import with non-empty srcDir should work. |
| env GO111MODULE=on |
| exec $WORK/testfindonly$GOEXE gobuild.example.com/x/y/z/i $WORK |
| ! stdout 'build constraints' |
| stdout '^dir=\$WORK.+i err=<nil>$' |
| |
| # Issue 37153: Import with empty srcDir should work. |
| env GO111MODULE=on |
| exec $WORK/testfindonly$GOEXE gobuild.example.com/x/y/z/i '' |
| ! stdout 'build constraints' |
| stdout '^dir=\$WORK.+i err=<nil>$' |
| |
| -- go.mod -- |
| module gobuild.example.com/x/y/z |
| |
| -- z.go -- |
| package z |
| |
| -- w/w1.go -- |
| package w |
| |
| -- i/i.go -- |
| // +build i |
| |
| package i |
| |
| -- testimport/x.go -- |
| package main |
| |
| import ( |
| "fmt" |
| "go/build" |
| "log" |
| "os" |
| "path/filepath" |
| "strings" |
| ) |
| |
| func main() { |
| // build.Import should support relative and absolute source dir paths. |
| path := os.Args[1] |
| srcDir := os.Args[2] |
| p1, err := build.Import(path, srcDir, 0) |
| if err != nil { |
| log.Fatal(err) |
| } |
| absSrcDir, err := filepath.Abs(srcDir) |
| if err != nil { |
| log.Fatal(err) |
| } |
| p2, err := build.Import(path, absSrcDir, 0) |
| if err != nil { |
| log.Fatal(err) |
| } |
| if p1.Dir != p2.Dir { |
| log.Fatalf("different packages loaded with relative and absolute paths:\n\t%s\n\t%s", p1.Dir, p2.Dir) |
| } |
| |
| fmt.Printf("%s\n%s\n", p1.Dir, strings.Join(p1.GoFiles, " ")) |
| } |
| |
| -- testfindonly/x.go -- |
| package main |
| |
| import ( |
| "fmt" |
| "go/build" |
| "os" |
| ) |
| |
| func main() { |
| p, err := build.Import(os.Args[1], os.Args[2], build.FindOnly) |
| fmt.Printf("dir=%s err=%v\n", p.Dir, err) |
| } |
| |
| -- $GOPATH/other/go.mod -- |
| module other/x/y |
| |
| -- $GOPATH/other/z/w/w2.go -- |
| package w |