protoc-gen-gotemplate
📂 protocol generator + golang text/template (protobuf)
A generic code/script/data generator based on Protobuf.
This project is a generator plugin for the Google Protocol Buffers compiler (protoc
).
The plugin parses protobuf files, generates an ast, and walks a local templates directory to generate files using the Golang's text/template
engine.
protobuf
files are parsed by protoc
ast
is generated by protoc-gen-go
helpers
ast
is given to Golang's text/template
engine for each user template filesprotoc-gen-gotemplate
requires a template_dir directory (by default ./templates
).
Every file ending with .tmpl
will be processed and written to the destination folder, following the file hierarchy of the template_dir
, and remove the .tmpl
extension.
$> ls -R
input.proto templates/doc.txt.tmpl templates/config.json.tmpl
$> protoc --gotemplate_out=. input.proto
$> ls -R
input.proto templates/doc.txt.tmpl templates/config.json.tmpl
doc.txt config.json
You can specify custom options, as follow:
$> protoc --gotemplate_out=debug=true,template_dir=/path/to/template/directory:. input.proto
Option | Default Value | Accepted Values | Description |
---|---|---|---|
template_dir    |
./template |
absolute or relative path | path to look for templates |
destination_dir   |
. Â Â Â Â Â |
absolute or relative path | base path to write output |
single-package-mode |
false |
true or false
|
if true, protoc won't accept multiple packages to be compiled at once (!= from all ), but will support Message lookup across the imported protobuf dependencies |
debug        |
false    |
true or false
|
if true, protoc will generate a more verbose output |
all         |
false    |
true or false     |
if true, protobuf files without Service will also be parsed |
Shipping the templates with your project is very smart and useful when contributing on git-based projects.
Another workflow consists in having a dedicated repository for generic templates which is then versioned and vendored with multiple projects (npm package, golang vendor package, ...)
See examples.
This project uses Masterminds/sprig library and additional functions to extend the builtin text/template helpers.
Non-exhaustive list of new helpers:
add
boolFieldExtension
camelCase
contains
divide
fieldMapKeyType
fieldMapValueType
first
getEnumValue
getMessageType
getProtoFile
goNormalize
goTypeWithPackage
goType
goZeroValue
haskellType
httpBody
httpPath
httpPathsAdditionalBindings
httpVerb
index
int64FieldExtension
isFieldMap
isFieldMessageTimeStamp
isFieldMessage
isFieldRepeated
jsSuffixReserved
jsType
json
kebabCase
last
leadingComment
leadingDetachedComments
lowerCamelCase
lowerFirst
lowerGoNormalize
multiply
namespacedFlowType
prettyjson
replaceDict
shortType
snakeCase
splitArray
stringFieldExtension
stringMethodOptionsExtension
string
subtract
trailingComment
trimstr
upperFirst
urlHasVarsFromMessage
See the project helpers for the complete list.
go install github.com/golang/protobuf/protoc-gen-go@latest
go install moul.io/protoc-gen-gotemplate@latest
Usage:
$> docker run --rm -v "$(pwd):$(pwd)" -w "$(pwd)" moul/protoc-gen-gotemplate -I. --gotemplate_out=./output/ ./*.proto
protoc-gen-gotemplate
MIT