You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
80 lines
2.2 KiB
Go
80 lines
2.2 KiB
Go
package protoc
|
|
|
|
import (
|
|
"archive/zip"
|
|
"fmt"
|
|
"os"
|
|
"path/filepath"
|
|
"runtime"
|
|
"strings"
|
|
|
|
"github.com/zeromicro/go-zero/tools/goctl/pkg/downloader"
|
|
"github.com/zeromicro/go-zero/tools/goctl/pkg/goctl"
|
|
"github.com/zeromicro/go-zero/tools/goctl/rpc/execx"
|
|
"github.com/zeromicro/go-zero/tools/goctl/util/env"
|
|
"github.com/zeromicro/go-zero/tools/goctl/util/zipx"
|
|
"github.com/zeromicro/go-zero/tools/goctl/vars"
|
|
)
|
|
|
|
var url = map[string]string{
|
|
"linux_32": "https://github.com/protocolbuffers/protobuf/releases/download/v3.19.4/protoc-3.19.4-linux-x86_32.zip",
|
|
"linux_64": "https://github.com/protocolbuffers/protobuf/releases/download/v3.19.4/protoc-3.19.4-linux-x86_64.zip",
|
|
"darwin": "https://github.com/protocolbuffers/protobuf/releases/download/v3.19.4/protoc-3.19.4-osx-x86_64.zip",
|
|
"windows_32": "https://github.com/protocolbuffers/protobuf/releases/download/v3.19.4/protoc-3.19.4-win32.zip",
|
|
"windows_64": "https://github.com/protocolbuffers/protobuf/releases/download/v3.19.4/protoc-3.19.4-win64.zip",
|
|
}
|
|
|
|
const (
|
|
Name = "protoc"
|
|
ZipFileName = Name + ".zip"
|
|
)
|
|
|
|
func Install(cacheDir string) (string, error) {
|
|
return goctl.Install(cacheDir, Name, func(dest string) (string, error) {
|
|
goos := runtime.GOOS
|
|
tempFile := filepath.Join(os.TempDir(), ZipFileName)
|
|
bit := 32 << (^uint(0) >> 63)
|
|
var downloadUrl string
|
|
switch goos {
|
|
case vars.OsMac:
|
|
downloadUrl = url[vars.OsMac]
|
|
case vars.OsWindows:
|
|
downloadUrl = url[fmt.Sprintf("%s_%d", vars.OsWindows, bit)]
|
|
case vars.OsLinux:
|
|
downloadUrl = url[fmt.Sprintf("%s_%d", vars.OsLinux, bit)]
|
|
default:
|
|
return "", fmt.Errorf("unsupport OS: %q", goos)
|
|
}
|
|
|
|
err := downloader.Download(downloadUrl, tempFile)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
return dest, zipx.Unpacking(tempFile, filepath.Dir(dest), func(f *zip.File) bool {
|
|
return filepath.Base(f.Name) == filepath.Base(dest)
|
|
})
|
|
})
|
|
}
|
|
|
|
func Exists() bool {
|
|
_, err := env.LookUpProtoc()
|
|
return err == nil
|
|
}
|
|
|
|
func Version() (string, error) {
|
|
path, err := env.LookUpProtoc()
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
version, err := execx.Run(path+" --version", "")
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
fields := strings.Fields(version)
|
|
if len(fields) > 1 {
|
|
return fields[1], nil
|
|
}
|
|
return "", nil
|
|
}
|