diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..bb9aa51 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,20 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Launch Package", + "type": "go", + "request": "launch", + "mode": "auto", + "program": "${workspaceFolder}", + "args": [ + "gen", + "provider", + "/projects/mp-qvyun/backend", + ] + } + ] +} \ No newline at end of file diff --git a/cmd/gen_provider.go b/cmd/gen_provider.go index 3b304b1..905a0d5 100644 --- a/cmd/gen_provider.go +++ b/cmd/gen_provider.go @@ -370,8 +370,15 @@ func renderFile(filename string, conf []Provider) error { for k, v := range item.Imports { // 如果是当前包的引用,直接使用包名 if strings.HasSuffix(k, "/"+v) { - v = "" + imports[k] = "" + continue } + + if gomod.GetPackageModuleName(k) == v { + imports[k] = "" + continue + } + imports[k] = v } }) diff --git a/pkg/utils/gomod/mod.go b/pkg/utils/gomod/mod.go index 317f226..df64d52 100644 --- a/pkg/utils/gomod/mod.go +++ b/pkg/utils/gomod/mod.go @@ -1,6 +1,8 @@ package gomod import ( + "bufio" + "errors" "fmt" "os" "path/filepath" @@ -40,7 +42,7 @@ func Parse(modPath string) error { goMod = &GoMod{file: f, modules: make(map[string]ModuleInfo)} for _, require := range f.Require { - if !require.Indirect { + if require.Indirect { continue } @@ -94,22 +96,33 @@ func getPackageName(pkg, version string) (string, error) { return "", err } - packagePattern := regexp.MustCompile(`package\s+(\w+)`) + packagePattern := regexp.MustCompile(`^package\s+(\w+)$`) + getFilePackageName := func(file string) (string, error) { + // 读取文件内容 + f, err := os.Open(file) + if err != nil { + return "", err + } + defer f.Close() + + scanner := bufio.NewScanner(f) + for scanner.Scan() { + line := scanner.Text() + if matches := packagePattern.FindStringSubmatch(line); matches != nil { + return matches[1], nil + } + } + return "", errors.New("no match") + } + if len(files) > 0 { for _, file := range files { if strings.HasSuffix(file, "_test.go") { continue } - // 读取文件内容 - content, err := os.ReadFile(file) - if err != nil { - return "", err - } - - packageName := packagePattern.FindStringSubmatch(string(content)) - if len(packageName) == 2 { - return packageName[1], nil + if name, err := getFilePackageName(file); err == nil { + return name, nil } } } diff --git a/pkg/utils/gomod/mod_test.go b/pkg/utils/gomod/mod_test.go index 9a3f710..cc08001 100644 --- a/pkg/utils/gomod/mod_test.go +++ b/pkg/utils/gomod/mod_test.go @@ -1,6 +1,9 @@ package gomod import ( + "bufio" + "os" + "regexp" "testing" "github.com/rogeecn/fabfile" @@ -21,12 +24,39 @@ func Test_ParseGoMod(t *testing.T) { func Test_getPackageName(t *testing.T) { Convey("Test getPackageName", t, func() { - Convey("", func() { - Convey("github.com/redis/go-redis/v9@v9.7.0", func() { - name, err := getPackageName("github.com/redis/go-redis/v9", "v9.7.0") - So(err, ShouldBeNil) - So(name, ShouldEqual, "redis") - }) + Convey("github.com/redis/go-redis/v9@v9.7.0", func() { + name, err := getPackageName("github.com/redis/go-redis/v9", "v9.7.0") + So(err, ShouldBeNil) + So(name, ShouldEqual, "redis") + }) + + Convey("github.com/pkg/errors@v0.9.1", func() { + name, err := getPackageName("github.com/pkg/errors", "v0.9.1") + So(err, ShouldBeNil) + So(name, ShouldEqual, "errors") + }) + }) +} + +func Test_file(t *testing.T) { + Convey("Test file", t, func() { + Convey("Test file", func() { + packagePattern := regexp.MustCompile(`^package\s+(\w+)$`) + file := "/root/go/pkg/mod/github.com/redis/go-redis/v9@v9.7.0/acl_commands.go" + + // read file line by line + f, err := os.Open(file) + So(err, ShouldBeNil) + defer f.Close() + + scanner := bufio.NewScanner(f) + for scanner.Scan() { + line := scanner.Text() + if matches := packagePattern.FindStringSubmatch(line); matches != nil { + t.Logf("Matched package name: %s", matches[1]) + } + } + So(scanner.Err(), ShouldBeNil) }) }) }