Skip to content

goctl-generated client code produces incorrect local path references in imports #5511

@Meng-Xin

Description

@Meng-Xin

环境信息

  • goctl 版本: 1.9.2
  • 操作系统: Windows 10
  • Go 版本: 1.25.5

项目结构

zero-rpc/
├── go.work
├── sales-admin/ # RPC 服务端
│ ├── go.mod # module sales-admin
│ ├── protoc/
│ │ └── admin.proto
│ └── adminClient/
│ └── admin.go # goctl 生成的客户端代码
├── sales-app/ # 另一个 RPC 服务端
│ └── go.mod # module sales-app
└── sales-center/ # 中央 proto 仓库(存储公用桩代码)
├── go.mod # module sales-center
└── gen/
└── admin/
├── admin.pb.go
└── admin_grpc.pb.go

执行命令

在 sales-admin 目录下执行:
goctl rpc protoc protoc/admin.proto --go_out=../sales-center --go-grpc_out=../sales-center --zrpc_out=. --style=goZero

Proto 文件

syntax = "proto3";
package admin;
option go_package = "../sales-center/gen/admin";

service Admin {
rpc GetUser (GetUserReq) returns (GetUserResp);
}

问题现象

生成的 sales-admin/adminClient/admin.go 文件中,导入路径出现了错误的本地文件系统路径:

package adminClient

import (
"context"

  "sales-admin/F:/coding/learn/zero-rpc/sales-center/gen/admin"  // ❌ 错误:混合了模块名和本地路径

  "github.com/zeromicro/go-zero/zrpc"
  "google.golang.org/grpc"

)

期望行为

生成的导入路径应该是纯模块引用:
import (
"sales-center/gen/admin" // ✅ 正确:纯包引用
)

根本原因分析

  1. option go_package 使用了相对路径 ../sales-center/gen/admin
  2. goctl 在解析时,将本地文件系统绝对路径(F:/coding/learn/zero-rpc/sales-center/gen/admin)错误地拼接到当前模块名(sales-admin)后面
  3. 正确行为应该是识别出输出目录 ../sales-center 属于 sales-center 模块,并使用该模块名作为导入前缀

临时解决方案

手动修改生成的 adminClient/admin.go,将导入路径改为:
"sales-center/gen/admin"

建议

在使用中央 proto 仓库模式时,option go_package 应支持或建议使用完整的模块路径格式,例如:
option go_package = "sales-center/gen/admin";

goctl 应该能够:

  1. 识别 --go_out 输出目录所属的 Go 模块
  2. 自动将包引用转换为正确的模块路径引用
Image

Metadata

Metadata

Assignees

No one assigned

    Labels

    area/goctlCategorizes issue or PR as related to goctl.kind/bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions