1 Star 0 Fork 0

eden-framework / eden-framework

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
importer.go 2.71 KB
一键复制 编辑 原始数据 按行查看 历史
文兄 提交于 2022-01-05 22:34 . change mod name
package importer
import (
"bytes"
"fmt"
str "gitee.com/eden-framework/strings"
"github.com/sirupsen/logrus"
"io"
"os/exec"
"strings"
)
type PackageImporter struct {
PackagePath string
pkgs map[string]*Package
}
func NewPackageImporter(packagePath string) *PackageImporter {
return &PackageImporter{
PackagePath: packagePath,
pkgs: make(map[string]*Package),
}
}
func (i *PackageImporter) mustGetPackage(packageList []string) {
for _, p := range packageList {
var stdout, stderr bytes.Buffer
cmd := exec.Command("go", "get", p)
cmd.Stdout = &stdout
cmd.Stderr = &stderr
logrus.Infof("command executing: %s", cmd.String())
err := cmd.Run()
if err != nil {
logrus.Panicf(
"go get err: %v\ngo get stdout: %s\ngo get stderr: %s\n",
err,
stdout.String(),
stderr.String(),
)
}
}
}
func (i *PackageImporter) AddImport(importPath string, p *Package) {
if _, ok := i.pkgs[importPath]; ok {
return
}
i.mustGetPackage([]string{importPath})
i.pkgs[importPath] = p
}
func (i *PackageImporter) Import(pkgNamePattern, searchPath string, useAlias bool) *Package {
pkgNamePattern = ParseVendor(pkgNamePattern)
p, ok := i.pkgs[pkgNamePattern]
if !ok {
pkgName := RetrievePackageName(pkgNamePattern)
p = &Package{
Name: pkgName,
PkgPath: pkgNamePattern,
}
if useAlias {
p.Alias = str.ToLowerSnakeCase(pkgNamePattern)
}
if searchPath == "" {
i.mustGetPackage([]string{pkgNamePattern})
}
i.pkgs[pkgNamePattern] = p
}
return p
}
func (i *PackageImporter) Use(pkgName string, subs ...string) string {
pkgName, decl := GetPackagePathAndDecl(strings.Join(append([]string{pkgName}, subs...), "/"))
p := i.Import(pkgName, "", true)
if decl != "" {
if pkgName == i.PackagePath {
return decl
}
return fmt.Sprintf("%s.%s", p.GetSelector(), decl)
}
return p.GetSelector()
}
func (i *PackageImporter) UseWithoutAlias(pkgName, searchPath string, subs ...string) string {
pkgName, decl := GetPackagePathAndDecl(strings.Join(append([]string{pkgName}, subs...), "/"))
p := i.Import(pkgName, searchPath, false)
if decl != "" {
if pkgName == i.PackagePath {
return decl
}
return fmt.Sprintf("%s.%s", p.GetSelector(), decl)
}
return p.GetSelector()
}
func (i *PackageImporter) WriteToImports(w io.Writer) {
if len(i.pkgs) > 0 {
for _, importPkg := range i.pkgs {
io.WriteString(w, importPkg.String()+"\n")
}
}
}
func (i *PackageImporter) String() string {
buf := &bytes.Buffer{}
if len(i.pkgs) > 0 {
buf.WriteString("import (\n")
i.WriteToImports(buf)
buf.WriteString(")\n\n")
}
return buf.String()
}
func (i *PackageImporter) Merge(target *PackageImporter) {
for importPath, pkg := range target.pkgs {
i.AddImport(importPath, pkg)
}
}
1
https://gitee.com/eden-framework/eden-framework.git
git@gitee.com:eden-framework/eden-framework.git
eden-framework
eden-framework
eden-framework
v2.0.2

搜索帮助