代码拉取完成,页面将自动刷新
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)
}
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。