diff --git a/cmd/gf/internal/cmd/cmd_z_unit_gen_service_test.go b/cmd/gf/internal/cmd/cmd_z_unit_gen_service_test.go index 322667dbcaa..99769f820f5 100644 --- a/cmd/gf/internal/cmd/cmd_z_unit_gen_service_test.go +++ b/cmd/gf/internal/cmd/cmd_z_unit_gen_service_test.go @@ -238,3 +238,48 @@ func Test_Gen_Service_PackagesFilter(t *testing.T) { t.Assert(files[0], dstFolder+filepath.FromSlash("/user.go")) }) } + +// https://github.com/gogf/gf/issues/4242 +// Test that versioned imports and aliased imports are correctly preserved. +// The issue is that imports like "github.com/minio/minio-go/v7" were being +// incorrectly handled because the package name (minio) differs from +// the directory name (minio-go). +func Test_Issue4242(t *testing.T) { + gtest.C(t, func(t *gtest.T) { + var ( + path = gfile.Temp(guid.S()) + dstFolder = path + filepath.FromSlash("/service") + srvFolder = gtest.DataPath("issue", "4242", "logic") + in = genservice.CGenServiceInput{ + SrcFolder: srvFolder, + DstFolder: dstFolder, + DstFileNameCase: "Snake", + WatchFile: "", + StPattern: "", + Packages: nil, + ImportPrefix: "", + Clear: false, + } + ) + err := gutil.FillStructWithDefault(&in) + t.AssertNil(err) + + err = gfile.Mkdir(path) + t.AssertNil(err) + defer gfile.Remove(path) + + _, err = genservice.CGenService{}.Service(ctx, in) + t.AssertNil(err) + + // Test versioned imports + t.Assert( + gfile.GetContents(dstFolder+filepath.FromSlash("/issue_4242.go")), + gfile.GetContents(gtest.DataPath("issue", "4242", "service", "issue_4242.go")), + ) + // Test aliased imports + t.Assert( + gfile.GetContents(dstFolder+filepath.FromSlash("/issue_4242_alias.go")), + gfile.GetContents(gtest.DataPath("issue", "4242", "service", "issue_4242_alias.go")), + ) + }) +} diff --git a/cmd/gf/internal/cmd/genservice/genservice_calculate.go b/cmd/gf/internal/cmd/genservice/genservice_calculate.go index 268585cb4f3..8a35318d763 100644 --- a/cmd/gf/internal/cmd/genservice/genservice_calculate.go +++ b/cmd/gf/internal/cmd/genservice/genservice_calculate.go @@ -12,7 +12,6 @@ import ( "github.com/gogf/gf/v2/container/garray" "github.com/gogf/gf/v2/container/gmap" - "github.com/gogf/gf/v2/os/gfile" "github.com/gogf/gf/v2/text/gregex" "github.com/gogf/gf/v2/text/gstr" @@ -37,21 +36,14 @@ func (c CGenService) calculateImportedItems( } for _, item := range pkgItems { - alias := item.Alias - - // If the alias is _, it means that the package is not generated. - if alias == "_" { + // Skip anonymous imports + if item.Alias == "_" { mlog.Debugf(`ignore anonymous package: %s`, item.RawImport) continue } - // If the alias is empty, it will use the package name as the alias. - if alias == "" { - alias = gfile.Basename(gstr.Trim(item.Path, `"`)) - } - if !gstr.Contains(allFuncParamType.String(), alias) { - mlog.Debugf(`ignore unused package: %s`, item.RawImport) - continue - } + // Keep all imports, let gofmt clean up unused ones. + // We cannot accurately infer package name from import path + // (e.g., path "minio-go" but package name is "minio"). srcImportedPackages.Add(item.RawImport) } return nil diff --git a/cmd/gf/internal/cmd/testdata/issue/4242/logic/issue4242/issue4242.go b/cmd/gf/internal/cmd/testdata/issue/4242/logic/issue4242/issue4242.go new file mode 100644 index 00000000000..11174d08a6b --- /dev/null +++ b/cmd/gf/internal/cmd/testdata/issue/4242/logic/issue4242/issue4242.go @@ -0,0 +1,34 @@ +package issue4242 + +import ( + "context" + + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/net/ghttp" + + "github.com/gogf/gf/cmd/gf/v2/internal/cmd/testdata/issue/4242/service" + + "github.com/gogf/gf/contrib/drivers/mysql/v2" +) + +func init() { + service.RegisterIssue4242(New()) +} + +type sIssue4242 struct { +} + +func New() *sIssue4242 { + return &sIssue4242{} +} + +// GetDriver tests versioned import path is preserved. +func (s *sIssue4242) GetDriver(ctx context.Context) (d mysql.Driver, err error) { + return mysql.Driver{}, nil +} + +// GetRequest tests another versioned import. +func (s *sIssue4242) GetRequest(ctx context.Context) (*ghttp.Request, error) { + g.Log().Info(ctx, "getting request") + return nil, nil +} diff --git a/cmd/gf/internal/cmd/testdata/issue/4242/logic/issue4242alias/issue4242alias.go b/cmd/gf/internal/cmd/testdata/issue/4242/logic/issue4242alias/issue4242alias.go new file mode 100644 index 00000000000..e1faa8e88aa --- /dev/null +++ b/cmd/gf/internal/cmd/testdata/issue/4242/logic/issue4242alias/issue4242alias.go @@ -0,0 +1,37 @@ +package issue4242alias + +import ( + "context" + + // Anonymous import (should be skipped) + _ "github.com/gogf/gf/v2/os/gres" + + // Versioned import without alias + "github.com/gogf/gf/v2/net/ghttp" + + "github.com/gogf/gf/cmd/gf/v2/internal/cmd/testdata/issue/4242/service" + + // Explicit alias import + mysqlDriver "github.com/gogf/gf/contrib/drivers/mysql/v2" +) + +func init() { + service.RegisterIssue4242Alias(New()) +} + +type sIssue4242Alias struct { +} + +func New() *sIssue4242Alias { + return &sIssue4242Alias{} +} + +// GetDriver tests explicit alias import. +func (s *sIssue4242Alias) GetDriver(ctx context.Context) (d mysqlDriver.Driver, err error) { + return mysqlDriver.Driver{}, nil +} + +// GetRequest tests versioned import. +func (s *sIssue4242Alias) GetRequest(ctx context.Context) (*ghttp.Request, error) { + return nil, nil +} diff --git a/cmd/gf/internal/cmd/testdata/issue/4242/logic/logic.go b/cmd/gf/internal/cmd/testdata/issue/4242/logic/logic.go new file mode 100644 index 00000000000..e877cd4f96c --- /dev/null +++ b/cmd/gf/internal/cmd/testdata/issue/4242/logic/logic.go @@ -0,0 +1,10 @@ +// ========================================================================== +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ========================================================================== + +package logic + +import ( + _ "github.com/gogf/gf/cmd/gf/v2/internal/cmd/testdata/issue/4242/logic/issue4242" + _ "github.com/gogf/gf/cmd/gf/v2/internal/cmd/testdata/issue/4242/logic/issue4242alias" +) diff --git a/cmd/gf/internal/cmd/testdata/issue/4242/service/issue_4242.go b/cmd/gf/internal/cmd/testdata/issue/4242/service/issue_4242.go new file mode 100644 index 00000000000..c1cb50fcafe --- /dev/null +++ b/cmd/gf/internal/cmd/testdata/issue/4242/service/issue_4242.go @@ -0,0 +1,37 @@ +// ================================================================================ +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// You can delete these comments if you wish manually maintain this interface file. +// ================================================================================ + +package service + +import ( + "context" + + "github.com/gogf/gf/contrib/drivers/mysql/v2" + "github.com/gogf/gf/v2/net/ghttp" +) + +type ( + IIssue4242 interface { + // GetDriver tests versioned import path is preserved. + GetDriver(ctx context.Context) (d mysql.Driver, err error) + // GetRequest tests another versioned import. + GetRequest(ctx context.Context) (*ghttp.Request, error) + } +) + +var ( + localIssue4242 IIssue4242 +) + +func Issue4242() IIssue4242 { + if localIssue4242 == nil { + panic("implement not found for interface IIssue4242, forgot register?") + } + return localIssue4242 +} + +func RegisterIssue4242(i IIssue4242) { + localIssue4242 = i +} diff --git a/cmd/gf/internal/cmd/testdata/issue/4242/service/issue_4242_alias.go b/cmd/gf/internal/cmd/testdata/issue/4242/service/issue_4242_alias.go new file mode 100644 index 00000000000..1b79023b07e --- /dev/null +++ b/cmd/gf/internal/cmd/testdata/issue/4242/service/issue_4242_alias.go @@ -0,0 +1,37 @@ +// ================================================================================ +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// You can delete these comments if you wish manually maintain this interface file. +// ================================================================================ + +package service + +import ( + "context" + + mysqlDriver "github.com/gogf/gf/contrib/drivers/mysql/v2" + "github.com/gogf/gf/v2/net/ghttp" +) + +type ( + IIssue4242Alias interface { + // GetDriver tests explicit alias import. + GetDriver(ctx context.Context) (d mysqlDriver.Driver, err error) + // GetRequest tests versioned import. + GetRequest(ctx context.Context) (*ghttp.Request, error) + } +) + +var ( + localIssue4242Alias IIssue4242Alias +) + +func Issue4242Alias() IIssue4242Alias { + if localIssue4242Alias == nil { + panic("implement not found for interface IIssue4242Alias, forgot register?") + } + return localIssue4242Alias +} + +func RegisterIssue4242Alias(i IIssue4242Alias) { + localIssue4242Alias = i +}