golist.go 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. package swag
  2. import (
  3. "bytes"
  4. "context"
  5. "encoding/json"
  6. "fmt"
  7. "go/build"
  8. "os/exec"
  9. "path/filepath"
  10. )
  11. func listPackages(ctx context.Context, dir string, env []string, args ...string) (pkgs []*build.Package, finalErr error) {
  12. cmd := exec.CommandContext(ctx, "go", append([]string{"list", "-json", "-e"}, args...)...)
  13. cmd.Env = env
  14. cmd.Dir = dir
  15. stdout, err := cmd.StdoutPipe()
  16. if err != nil {
  17. return nil, err
  18. }
  19. var stderrBuf bytes.Buffer
  20. cmd.Stderr = &stderrBuf
  21. defer func() {
  22. if stderrBuf.Len() > 0 {
  23. finalErr = fmt.Errorf("%v\n%s", finalErr, stderrBuf.Bytes())
  24. }
  25. }()
  26. err = cmd.Start()
  27. if err != nil {
  28. return nil, err
  29. }
  30. dec := json.NewDecoder(stdout)
  31. for dec.More() {
  32. var pkg build.Package
  33. err = dec.Decode(&pkg)
  34. if err != nil {
  35. return nil, err
  36. }
  37. pkgs = append(pkgs, &pkg)
  38. }
  39. err = cmd.Wait()
  40. if err != nil {
  41. return nil, err
  42. }
  43. return pkgs, nil
  44. }
  45. func (parser *Parser) getAllGoFileInfoFromDepsByList(pkg *build.Package) error {
  46. ignoreInternal := pkg.Goroot && !parser.ParseInternal
  47. if ignoreInternal { // ignored internal
  48. return nil
  49. }
  50. srcDir := pkg.Dir
  51. var err error
  52. for i := range pkg.GoFiles {
  53. err = parser.parseFile(pkg.ImportPath, filepath.Join(srcDir, pkg.GoFiles[i]), nil)
  54. if err != nil {
  55. return err
  56. }
  57. }
  58. // parse .go source files that import "C"
  59. for i := range pkg.CgoFiles {
  60. err = parser.parseFile(pkg.ImportPath, filepath.Join(srcDir, pkg.CgoFiles[i]), nil)
  61. if err != nil {
  62. return err
  63. }
  64. }
  65. return nil
  66. }