feat(goctl): go work multi-module support (#1800)

* feat(goctl): go work multi-module support

Resolve: #1793

* chore: print log when getting project ctx fails
This commit is contained in:
Fyn
2022-04-18 20:36:41 +08:00
committed by GitHub
parent 92b450eb11
commit e62870e268
5 changed files with 118 additions and 17 deletions

View File

@@ -1,11 +1,14 @@
package ctx
import (
"encoding/json"
"errors"
"fmt"
"io"
"os"
"path/filepath"
"strings"
"github.com/zeromicro/go-zero/core/jsonx"
"github.com/zeromicro/go-zero/tools/goctl/rpc/execx"
"github.com/zeromicro/go-zero/tools/goctl/util/pathx"
)
@@ -36,16 +39,11 @@ func projectFromGoMod(workDir string) (*ProjectContext, error) {
return nil, err
}
data, err := execx.Run("go list -json -m", workDir)
m, err := getRealModule(workDir, execx.Run)
if err != nil {
return nil, err
}
var m Module
err = jsonx.Unmarshal([]byte(data), &m)
if err != nil {
return nil, err
}
var ret ProjectContext
ret.WorkDir = workDir
ret.Name = filepath.Base(m.Dir)
@@ -58,3 +56,34 @@ func projectFromGoMod(workDir string) (*ProjectContext, error) {
ret.Path = m.Path
return &ret, nil
}
func getRealModule(workDir string, execRun execx.RunFunc) (*Module, error) {
data, err := execRun("go list -json -m", workDir)
if err != nil {
return nil, err
}
modules, err := decodePackages(strings.NewReader(data))
if err != nil {
return nil, err
}
for _, m := range modules {
if strings.HasPrefix(workDir, m.Dir) {
return &m, nil
}
}
return nil, errors.New("no matched module")
}
func decodePackages(rc io.Reader) ([]Module, error) {
var modules []Module
decoder := json.NewDecoder(rc)
for decoder.More() {
var m Module
if err := decoder.Decode(&m); err != nil {
return nil, fmt.Errorf("invalid module: %v", err)
}
modules = append(modules, m)
}
return modules, nil
}