protoc-gen-go-micro/README.md

136 lines
4.7 KiB
Markdown
Raw Permalink Normal View History

# `protoc-gen-micro`
2016-11-04 23:44:49 +03:00
:open_file_folder: protocol generator + golang text/template (protobuf)
2016-11-07 12:17:25 +03:00
A generic **code**/script/data generator based on [Protobuf](https://developers.google.com/protocol-buffers/).
2016-11-07 12:17:25 +03:00
2016-11-09 23:48:26 +03:00
---
2017-03-16 18:15:10 +03:00
This project is a generator plugin for the Google Protocol Buffers compiler (`protoc`).
2016-11-09 23:48:26 +03:00
The plugin parses **protobuf** files, generates an **ast**, and walks a local **templates directory** to generate files using the [Golang's `text/template` engine](https://golang.org/pkg/text/template/).
## Philosophy
* protobuf-first
* no built-in template, only user defined templates
* kiss, *keep it stupid simple*
## Under the hood
1. the *user* `protobuf` files are parsed by [`protoc`](https://github.com/google/protobuf/releases)
2. the `ast` is generated by [`protoc-gen-go` helpers](https://github.com/golang/protobuf/tree/master/protoc-gen-go)
3. the `ast` is given to [Golang's `text/template` engine](https://golang.org/pkg/text/template/) for each *user* template files
4. the *funcmap* enriching the template engine is based on [Masterminds/sprig](https://github.com/Masterminds/sprig), and contains type-manipulation, iteration and language-specific helpers
2016-11-09 23:48:26 +03:00
2016-11-07 12:17:25 +03:00
## Usage
`protoc-gen-micro` requires a **template_dir** directory *(by default `./templates`)*.
2016-11-09 23:48:26 +03:00
2017-03-16 18:15:10 +03:00
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.
2016-11-09 23:48:26 +03:00
---
```console
$> ls -R
input.proto templates/doc.txt.tmpl templates/config.json.tmpl
$> protoc --micro_out=. input.proto
2016-11-09 23:48:26 +03:00
$> ls -R
input.proto templates/doc.txt.tmpl templates/config.json.tmpl
doc.txt config.json
```
### Options
2016-11-09 23:48:26 +03:00
You can specify custom options, as follow:
2016-11-09 23:48:26 +03:00
```console
$> protoc --micro_out=debug=true,template_dir=/path/to/template/directory:. input.proto
2016-11-09 23:48:26 +03:00
```
| Option | Default Value | Accepted Values | Description
|-----------------------|---------------|---------------------------|-----------------------
| `template_repo` | `` | url in form schema://domain | path to repo with optional branch or revision after @ sign
| `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
| `components` | `micro` | `micro|grpc|http|chi|gorilla` | some values cant coexists like gorilla/chi or grpc/http
2017-03-16 18:15:10 +03:00
##### Hints
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, ...)
2016-12-10 19:23:59 +03:00
## Funcmap
2016-12-15 15:40:39 +03:00
This project uses [Masterminds/sprig](https://github.com/Masterminds/sprig) library and additional functions to extend the builtin [text/template](https://golang.org/pkg/text/template) helpers.
2016-12-10 19:23:59 +03:00
2018-03-21 16:41:40 +03:00
Non-exhaustive list of new helpers:
2016-12-10 19:23:59 +03:00
2016-12-15 15:41:32 +03:00
* **all the functions from [sprig](https://github.com/Masterminds/sprig)**
2019-01-18 21:39:16 +03:00
* `add`
* `boolFieldExtension`
* `camelCase`
2018-03-21 16:41:40 +03:00
* `contains`
2019-01-18 21:39:16 +03:00
* `divide`
* `fieldMapKeyType`
* `fieldMapValueType`
* `first`
* `getEnumValue`
2019-01-18 21:39:16 +03:00
* `getMessageType`
* `getProtoFile`
* `goNormalize`
* `goTypeWithPackage`
* `goType`
2018-03-21 16:41:40 +03:00
* `goZeroValue`
2019-01-18 21:39:16 +03:00
* `haskellType`
* `httpBody`
* `httpPath`
2018-03-21 16:41:40 +03:00
* `httpPathsAdditionalBindings`
2019-01-18 21:39:16 +03:00
* `httpVerb`
* `index`
* `int64FieldExtension`
* `isFieldMap`
* `isFieldMessageTimeStamp`
* `isFieldMessage`
* `isFieldRepeated`
* `jsSuffixReserved`
* `jsType`
* `json`
* `kebabCase`
* `last`
2018-03-21 16:41:40 +03:00
* `leadingComment`
* `leadingDetachedComments`
2019-01-18 21:39:16 +03:00
* `lowerCamelCase`
* `lowerFirst`
* `lowerGoNormalize`
* `multiply`
* `namespacedFlowType`
* `prettyjson`
* `replaceDict`
* `shortType`
* `snakeCase`
* `splitArray`
2018-03-21 16:41:40 +03:00
* `stringFieldExtension`
* `stringMethodOptionsExtension`
2019-01-18 21:39:16 +03:00
* `string`
2018-03-21 16:41:40 +03:00
* `subtract`
2019-01-18 21:39:16 +03:00
* `trailingComment`
* `trimstr`
* `upperFirst`
* `urlHasVarsFromMessage`
2016-12-15 15:40:39 +03:00
See the project helpers for the complete list.
2016-12-10 19:23:59 +03:00
2016-11-07 12:17:25 +03:00
## Install
* Install the **Go** compiler and tools from https://golang.org/doc/install
* Install **protobuf**: `go get -u github.com/golang/protobuf/{proto,protoc-gen-go}`
* Install **protoc-gen-micro**: `go get -u github.com/unistack-org/protoc-gen-micro`
2019-05-03 14:58:23 +03:00
2016-11-07 12:17:25 +03:00
## License
MIT