This is an automated email from the ASF dual-hosted git repository.
xuetaoli pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/dubbo-go.git
The following commit(s) were added to refs/heads/develop by this push:
new cdf278029 Fix the issue of multiple package imports when generating
triple files. (#3052)
cdf278029 is described below
commit cdf2780291812b444d8a437ce24b94d3209f20e7
Author: hs80 <[email protected]>
AuthorDate: Sat Nov 1 13:07:27 2025 +0800
Fix the issue of multiple package imports when generating triple files.
(#3052)
* 修复生成triple时,多包引入问题 修复proto包中引用自定义common包时,命名冲突问题
---
.../gen/generator/genTriple.go | 28 ++++-----------
.../gen/generator/tripleTpl.go | 5 ---
tools/protoc-gen-go-triple/go.mod | 5 +--
tools/protoc-gen-go-triple/go.sum | 4 +--
tools/protoc-gen-go-triple/main.go | 40 +++++++++++++++++++---
5 files changed, 45 insertions(+), 37 deletions(-)
diff --git a/tools/protoc-gen-go-triple/gen/generator/genTriple.go
b/tools/protoc-gen-go-triple/gen/generator/genTriple.go
index fb16e2bf7..89051d4c2 100644
--- a/tools/protoc-gen-go-triple/gen/generator/genTriple.go
+++ b/tools/protoc-gen-go-triple/gen/generator/genTriple.go
@@ -18,15 +18,12 @@
package generator
import (
- "errors"
"os"
"path/filepath"
"strings"
)
import (
- "github.com/golang/protobuf/protoc-gen-go/descriptor"
-
"google.golang.org/protobuf/compiler/protogen"
)
@@ -59,21 +56,22 @@ func (g *Generator) generateToFile(filePath string, data
[]byte) error {
return util.GoFmtFile(filePath)
}
-func ProcessProtoFile(file *descriptor.FileDescriptorProto) (TripleGo, error) {
+func ProcessProtoFile(g *protogen.GeneratedFile, f *protogen.File) (TripleGo,
error) {
+ file := f.Proto
tripleGo := TripleGo{
Source: file.GetName(),
ProtoPackage: file.GetPackage(),
Services: make([]Service, 0),
}
- for _, service := range file.GetService() {
+ for serviceIndex, service := range file.GetService() {
serviceMethods := make([]Method, 0)
- for _, method := range service.GetMethod() {
+ for methodIndex, method := range service.GetMethod() {
serviceMethods = append(serviceMethods, Method{
MethodName: method.GetName(),
- RequestType:
util.ToUpper(strings.Split(method.GetInputType(),
".")[len(strings.Split(method.GetInputType(), "."))-1]),
+ RequestType:
g.QualifiedGoIdent(f.Services[serviceIndex].Methods[methodIndex].Input.GoIdent),
StreamsRequest: method.GetClientStreaming(),
- ReturnType:
util.ToUpper(strings.Split(method.GetOutputType(),
".")[len(strings.Split(method.GetOutputType(), "."))-1]),
+ ReturnType:
g.QualifiedGoIdent(f.Services[serviceIndex].Methods[methodIndex].Output.GoIdent),
StreamsReturn: method.GetServerStreaming(),
})
if method.GetClientStreaming() ||
method.GetServerStreaming() {
@@ -86,20 +84,6 @@ func ProcessProtoFile(file *descriptor.FileDescriptorProto)
(TripleGo, error) {
Methods: serviceMethods,
})
}
- var goPkg string
- pkgs := strings.Split(file.Options.GetGoPackage(), ";")
- switch len(pkgs) {
- case 2:
- tripleGo.Package = pkgs[1]
- goPkg = pkgs[0]
- case 1:
- tripleGo.Package = file.GetPackage()
- goPkg = file.GetPackage()
- default:
- return tripleGo, errors.New("need to set the package name in
go_package")
- }
-
- goPkg = strings.ReplaceAll(goPkg, "/", "_")
_, fileName := filepath.Split(file.GetName())
tripleGo.FileName = strings.Split(fileName, ".")[0]
return tripleGo, nil
diff --git a/tools/protoc-gen-go-triple/gen/generator/tripleTpl.go
b/tools/protoc-gen-go-triple/gen/generator/tripleTpl.go
index 643f2d54d..18ca04b2a 100644
--- a/tools/protoc-gen-go-triple/gen/generator/tripleTpl.go
+++ b/tools/protoc-gen-go-triple/gen/generator/tripleTpl.go
@@ -145,11 +145,6 @@ import (
import (
"dubbo.apache.org/dubbo-go/v3"
- "dubbo.apache.org/dubbo-go/v3/client"
- "dubbo.apache.org/dubbo-go/v3/common"
- "dubbo.apache.org/dubbo-go/v3/common/constant"
- "dubbo.apache.org/dubbo-go/v3/protocol/triple/triple_protocol"
- "dubbo.apache.org/dubbo-go/v3/server"
)
`
diff --git a/tools/protoc-gen-go-triple/go.mod
b/tools/protoc-gen-go-triple/go.mod
index c5e831eeb..4750061ec 100644
--- a/tools/protoc-gen-go-triple/go.mod
+++ b/tools/protoc-gen-go-triple/go.mod
@@ -2,7 +2,4 @@ module dubbo.apache.org/dubbo-go/v3/tools/protoc-gen-go-triple
go 1.23
-require (
- github.com/golang/protobuf v1.5.4
- google.golang.org/protobuf v1.34.2
-)
+require google.golang.org/protobuf v1.36.10
diff --git a/tools/protoc-gen-go-triple/go.sum
b/tools/protoc-gen-go-triple/go.sum
index 9e46e8c15..837ddd1ee 100644
--- a/tools/protoc-gen-go-triple/go.sum
+++ b/tools/protoc-gen-go-triple/go.sum
@@ -1,8 +1,8 @@
-github.com/golang/protobuf v1.5.4
h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
-github.com/golang/protobuf v1.5.4/go.mod
h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU=
github.com/google/go-cmp v0.5.5/go.mod
h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543
h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod
h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
google.golang.org/protobuf v1.34.2
h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg=
google.golang.org/protobuf v1.34.2/go.mod
h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw=
+google.golang.org/protobuf v1.36.10
h1:AYd7cD/uASjIL6Q9LiTjz8JLcrh/88q5UObnmY3aOOE=
+google.golang.org/protobuf v1.36.10/go.mod
h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco=
diff --git a/tools/protoc-gen-go-triple/main.go
b/tools/protoc-gen-go-triple/main.go
index 2ac907a3c..1dee399c0 100644
--- a/tools/protoc-gen-go-triple/main.go
+++ b/tools/protoc-gen-go-triple/main.go
@@ -25,6 +25,7 @@ import (
"flag"
"fmt"
"os"
+ "strings"
)
import (
@@ -75,17 +76,48 @@ func main() {
}
func genTriple(plugin *protogen.Plugin) error {
+ var errors []error
+
for _, file := range plugin.Files {
if !file.Generate {
continue
}
- tripleGo, err := generator.ProcessProtoFile(file.Proto)
- if err != nil {
- return err
+
+ // Skip proto files without services.
+ if len(file.Proto.GetService()) == 0 {
+ continue
}
+
filename := file.GeneratedFilenamePrefix + ".triple.go"
+ // Use the same import path as the pb.go file to ensure they're
in the same package
+ // Extract the package name from the go_package option
+ // Use the import path as parsed by protogen to avoid edge
cases.
g := plugin.NewGeneratedFile(filename, file.GoImportPath)
- return generator.GenTripleFile(g, tripleGo)
+ // import Dubbo's libraries
+
g.QualifiedGoIdent(protogen.GoImportPath("dubbo.apache.org/dubbo-go/v3/client").Ident("client"))
+
g.QualifiedGoIdent(protogen.GoImportPath("dubbo.apache.org/dubbo-go/v3/common").Ident("common"))
+
g.QualifiedGoIdent(protogen.GoImportPath("dubbo.apache.org/dubbo-go/v3/common/constant").Ident("constant"))
+
g.QualifiedGoIdent(protogen.GoImportPath("dubbo.apache.org/dubbo-go/v3/protocol/triple/triple_protocol").Ident("triple_protocol"))
+
g.QualifiedGoIdent(protogen.GoImportPath("dubbo.apache.org/dubbo-go/v3/server").Ident("server"))
+ tripleGo, err := generator.ProcessProtoFile(g, file)
+ if err != nil {
+ errors = append(errors, fmt.Errorf("processing %s: %w",
file.Desc.Path(), err))
+ continue
+ }
+ // Ensure the generated file uses the exact Go package name
computed by protoc-gen-go.
+ tripleGo.Package = string(file.GoPackageName)
+
+ err = generator.GenTripleFile(g, tripleGo)
+ if err != nil {
+ errors = append(errors, fmt.Errorf("generating %s: %w",
filename, err))
+ }
+ }
+ if len(errors) > 0 {
+ var errorMessages []string
+ for _, err := range errors {
+ errorMessages = append(errorMessages, err.Error())
+ }
+ return fmt.Errorf("multiple errors occurred:\n%s",
strings.Join(errorMessages, "\n"))
}
return nil
}