Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

protoc-gen-twirp 链接问题 #48

Closed
busyfree opened this issue Apr 12, 2022 · 11 comments
Closed

protoc-gen-twirp 链接问题 #48

busyfree opened this issue Apr 12, 2022 · 11 comments

Comments

@busyfree
Copy link

rpc/README.md 这里的 protoc-gen-twirp 是个死链接。正确的是 bilibili/twirp/protoc-gen-twirp 这个插件吗?

@taoso
Copy link
Member

taoso commented Apr 12, 2022

cmd/protoc-gen-twirp 已经跟 cmd/sniper 脚手架合并了。这样做可以避免安装多个工具,降低使用门槛。

@busyfree
Copy link
Author

OK,我看Makefile 文件里面 没有涉及到 build protoc-gen-twirp 这个插件,直接使用protoc --plugin=protoc-gen-twirp 这个插件。

@busyfree
Copy link
Author

rpc/common/common.proto

syntax = "proto3";

package common;

option go_package = "./common";


message Empty {

}

rpc/mp/v1/public/service.proto

syntax = "proto3";

package mp.v1.public;

option go_package = "./mp/v1/public";

import "common/common.proto";

service Server {
   rpc Test (common.Empty) returns (TestResp);
}

rpc 下面定义了一个service pb和一个 common pb,sniper下 pb 生成支持这样的结构吗?

@taoso
Copy link
Member

taoso commented Apr 12, 2022

OK,我看Makefile 文件里面 没有涉及到 build protoc-gen-twirp 这个插件,直接使用protoc --plugin=protoc-gen-twirp 这个插件。

这里面有一个小细节

protoc --plugin=protoc-gen-twirp=$(shell which sniper) \

protoc 约定所有的插件名必须是 protoc-gen-XXX,这里的 XXX 对应 --out_XXX。早期 sniper 需要安装 protoc-gen-twirp 和 sniper 两个工具。后面我把 protoc-gen-twirp 的功能整合到 sniper 命令里。但 sniper 的命令不符合 protoc-gen-XXX 约定,所以在调用 protoc 的时候需要通过--plugin=protoc-gen-twirp=$(shell which sniper)来指定使用 sniper 生成 twirp 代码。

@busyfree
Copy link
Author

嗯,看到了,感谢解答。

@taoso
Copy link
Member

taoso commented Apr 12, 2022

rpc 下面定义了一个service pb和一个 common pb,sniper下 pb 生成支持这样的结构吗?

可以的。不过导入 proto 的路径需要从 rpc 目录开始。而且被导入的 proto 文件需要使用 go_package 声明自己的完整包名。如果项目的包名是 helloworld,那么 common.proto 的 go_package 应该是helloworld/rpc/common。而 service.proto 导包的时候应该写成import rpc/common/common.proto

@busyfree
Copy link
Author

好的,感谢。

@busyfree
Copy link
Author

busyfree commented Apr 13, 2022

测试了一下rpc输出,go_out的包名有错误,twrip的 package 输出也是和下面的 go out 一样。
代码里临时修改,只能解决twrip out 的包名问题。

func (t *twirp) generateFileHeader(file *protogen.File) {
	t.P("// Package ", string(file.GoPackageName), " is generated by sniper ", Version, ", DO NOT EDIT.")
	t.P("// source: ", file.Desc.Path())
	pkgName := string(file.GoPackageName)
	if strings.Contains(pkgName, "/") {
		pkgName = strings.ReplaceAll(pkgName, "/", "_")
	}
	t.P(`package `, pkgName)
	t.P()
}
--go_out: rpc/mp/v1/public/service.pb.go: unparsable Go source: 7:14: expected ';', found '/'
    1	// Code generated by protoc-gen-go. DO NOT EDIT.
    2	// versions:
    3	// 	protoc-gen-go v1.27.1
    4	// 	protoc        v3.19.4
    5	// source: rpc/mp/v1/public/service.proto
    6	
    7	package mp_v1/public
    8	
// common.proto
syntax = "proto3";

package rpc.common;

option go_package = "sniper/rpc/common";

message Empty {

}

// service.proto
syntax = "proto3";

package rpc.mp.v1.public;

option go_package = "sniper/rpc/mp/v1/public";

import "rpc/common/common.proto";

service Server {
  rpc Test (common.Empty) returns (TestResp);
}


message TestResp {
  int32 code = 1;
  string msg = 2;
}

@busyfree busyfree reopened this Apr 13, 2022
@busyfree
Copy link
Author

Makefile 里面的 $m 变量输出,不是期望的 rpc/util/v0/kv.proto => rpc/util/v0;util_v0


rpc/common/common.proto=rpc/common;common

protoc --plugin=protoc-gen-twirp=/Users/tdbackend/Devland/codes/go/libs/bin/sniper
--twirp_out=Mrpc/common/common.proto=rpc/common;common:.
--go_out=Mrpc/common/common.proto=rpc/common;common:.
rpc/common/common.proto

rpc/mp/v1/public/service.proto=rpc/mp/v1/public;mp_v1/public

protoc --plugin=protoc-gen-twirp=/Users/tdbackend/Devland/codes/go/libs/bin/sniper
--twirp_out=Mrpc/mp/v1/public/service.proto=rpc/mp/v1/public;mp_v1/public:.
--go_out=Mrpc/mp/v1/public/service.proto=rpc/mp/v1/public;mp_v1/public:.
rpc/mp/v1/public/service.proto

@busyfree
Copy link
Author

$m 这个脚本看样是只能支持3级目录,3级以上处理就出问题了。

@busyfree
Copy link
Author

还有个问题,能把这个 protoc-gen-markdown 插件一起引入到protoc 脚本里吗?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants