protoc.go 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. package protoc
  2. import (
  3. "archive/zip"
  4. "fmt"
  5. "os"
  6. "path/filepath"
  7. "runtime"
  8. "strings"
  9. "github.com/zeromicro/go-zero/tools/goctl/pkg/downloader"
  10. "github.com/zeromicro/go-zero/tools/goctl/pkg/goctl"
  11. "github.com/zeromicro/go-zero/tools/goctl/rpc/execx"
  12. "github.com/zeromicro/go-zero/tools/goctl/util/env"
  13. "github.com/zeromicro/go-zero/tools/goctl/util/zipx"
  14. "github.com/zeromicro/go-zero/tools/goctl/vars"
  15. )
  16. var url = map[string]string{
  17. "linux_32": "https://github.com/protocolbuffers/protobuf/releases/download/v3.19.4/protoc-3.19.4-linux-x86_32.zip",
  18. "linux_64": "https://github.com/protocolbuffers/protobuf/releases/download/v3.19.4/protoc-3.19.4-linux-x86_64.zip",
  19. "darwin": "https://github.com/protocolbuffers/protobuf/releases/download/v3.19.4/protoc-3.19.4-osx-x86_64.zip",
  20. "windows_32": "https://github.com/protocolbuffers/protobuf/releases/download/v3.19.4/protoc-3.19.4-win32.zip",
  21. "windows_64": "https://github.com/protocolbuffers/protobuf/releases/download/v3.19.4/protoc-3.19.4-win64.zip",
  22. }
  23. const (
  24. Name = "protoc"
  25. ZipFileName = Name + ".zip"
  26. )
  27. func Install(cacheDir string) (string, error) {
  28. return goctl.Install(cacheDir, Name, func(dest string) (string, error) {
  29. goos := runtime.GOOS
  30. tempFile := filepath.Join(os.TempDir(), ZipFileName)
  31. bit := 32 << (^uint(0) >> 63)
  32. var downloadUrl string
  33. switch goos {
  34. case vars.OsMac:
  35. downloadUrl = url[vars.OsMac]
  36. case vars.OsWindows:
  37. downloadUrl = url[fmt.Sprintf("%s_%d", vars.OsWindows, bit)]
  38. case vars.OsLinux:
  39. downloadUrl = url[fmt.Sprintf("%s_%d", vars.OsLinux, bit)]
  40. default:
  41. return "", fmt.Errorf("unsupport OS: %q", goos)
  42. }
  43. err := downloader.Download(downloadUrl, tempFile)
  44. if err != nil {
  45. return "", err
  46. }
  47. return dest, zipx.Unpacking(tempFile, filepath.Dir(dest), func(f *zip.File) bool {
  48. return filepath.Base(f.Name) == filepath.Base(dest)
  49. })
  50. })
  51. }
  52. func Exists() bool {
  53. _, err := env.LookUpProtoc()
  54. return err == nil
  55. }
  56. func Version() (string, error) {
  57. path, err := env.LookUpProtoc()
  58. if err != nil {
  59. return "", err
  60. }
  61. version, err := execx.Run(path+" --version", "")
  62. if err != nil {
  63. return "", err
  64. }
  65. fields := strings.Fields(version)
  66. if len(fields) > 1 {
  67. return fields[1], nil
  68. }
  69. return "", nil
  70. }