项目及桩代码生成
October 17, 2023 · View on GitHub
English | 中文
项目及桩代码生成
完整项目生成
以下 helloworld.proto 的内容可以参考 /testcase/create/1-without-import/helloworld.proto
trpc create -p helloworld.proto
默认会在当前目录生成完整的项目,带有桩代码以及服务端/客户端示例。
可以通过 -o 来指定输出目录,比如:
trpc create -p helloworld.proto -o out
如果输出目录已经存在生成的项目,可以使用 -f 进行强制覆盖,如:
trpc create -p helloworld.proto -o out -f
仅桩代码生成
通过添加 --rpconly 可以只生成桩代码(pb.go 以及 trpc.go):
trpc create -p helloworld.proto -o out --rpconly
在默认情况下还会生成 go.mod 以及 _mock.go 文件,可以通过 --nogomod 以及 --mock=false 来禁用:
trpc create -p helloworld.proto -o out --rpconly --nogomod --mock=false
指定含有依赖的 proto 文件的代码生成
之前所描述的情况对于不存在 import 其他 proto 的案例来说已经够用了,对于所指定的 proto 文件中存在对其他 proto 文件 import 了的情况,则需要用 -d 来指定对依赖 proto 文件的搜索路径,由于在 import 时存在非常多的可能情况,用户可以参考 /testcase/create/ 目录下的 2 到 5 的例子进行模仿学习。
在仅桩代码生成时同时生成依赖 proto 的桩代码
在指定了 --rpconly 的时候,假如 proto 文件存在对其他 proto 文件的 import,在默认情况下,只会生成直接指定的这个 proto 文件所对应的桩代码,这种默认情况的本意是为了使用户采用对每个 proto 文件进行单独桩代码生成而处理的。
假如用户期望能够同时生成依赖的桩代码,可以添加 --dependencystub 选项来启用。
指定工程的 go module name
在生成完整项目时,项目的 go module name 会从 proto 文件的 proto package name 中推出来,用户可以指定 --mod=xxxx 来改变项目的 go module name
注意:这个改变的是生成项目时的 go module name,而不是桩代码本身的 go module name,桩代码本身的 go module name 由 proto 文件中的 go_package 决定。
生成其他协议桩代码
通过指定 --protocol=http 可以生成 HTTP RPC 服务,默认为 --protocol=trpc 即生成 trpc 协议服务。
生成 flatbuffers 桩代码
通过指定 --fbs=xxx.fbs 指定 flatbuffers 的协议文件,通过 --fbsdir 来指定文件及依赖的搜索路径。
这两个选项类似于 -p 以及 -d 在 protobuf 下的作用。
flatbuffers 相关的写法用例可以参考 /testcase/flatbuffers/ 下的文件进行学习。
模版支持自定义变量及环境变量
自定义变量 --kvrawjson
首先修改 *.tpl,在其中引用自定义变量如下:
// test json key-value: {{ .KVs.k1 }}
其中 k1 为要访问的 key 名,然后指定 --assetdir 以及 --kvrawjson:
trpc create -p testcase/create/1-without-import/helloworldworld.proto \
--assetdir ~/.trpc-cmdline-assets/install/protobuf/asset_go \
--rpconly \
-o out \
--mock=false \
--kvrawjson='{"k1":"v1"}'
这样最终生成的 tpl.go 中可以显示对应的 value:
// test json key-value: v1
并且这种做法天然支持嵌套 key-value(第一层 key 的类型必须为 string),比如:
// test json key-value: {{ .KVs.k1.k2 }}
trpc create -p testcase/create/1-without-import/helloworldworld.proto \
--assetdir ~/.trpc-cmdline-assets/install/protobuf/asset_go \
--rpconly \
-o out \
--mock=false \
--kvrawjson='{"k1":{"k2":"v2"}}'
// test json key-value: v2
自定义变量 --kvfile
--kvfile 和 --kvrawjson 的区别在于:前者指定的是一个 json 文件名,用法如下:
trpc create -p testcase/create/1-without-import/helloworldworld.proto \
--assetdir ~/.trpc-cmdline-assets/install/protobuf/asset_go \
--rpconly \
-o out \
--mock=false \
--kvfile ./test.json
并且这两个 flag 可以同时使用,指定的 key-value 会融合到同一个 map 中
trpc create -p testcase/create/1-without-import/helloworldworld.proto \
--assetdir ~/.trpc-cmdline-assets/install/protobuf/asset_go \
--rpconly \
-o out \
--mock=false \
--kvfile ./test.json \
--kvrawjson='{"kkk":"xv"}'
在模板中使用环境变量
只需要在 .tpl 文件中使用 .Envs.XXXX,即可访问对应的环境变量,比如:
// get envs: {{ .Envs.USER }}
生成后对应:
// get envs: root
自定义桩代码中的 app 以及 server 名
示例:
trpc create -p helloworld.proto -o out --app="someappname" --server="someservername"