Feature: Add goctl env (#1557)
This commit is contained in:
79
tools/goctl/pkg/protoc/protoc.go
Normal file
79
tools/goctl/pkg/protoc/protoc.go
Normal file
@@ -0,0 +1,79 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user