# protoc-prebuilt
[![crates.io][crates-io-shields]][crates-io]
[![docs.rs][docs-rs-shields]][docs-rs]
[![license][license-shields]][license]
[crates-io]: https://crates.io/crates/protoc-prebuilt
[crates-io-shields]: https://img.shields.io/crates/v/protoc-prebuilt
[docs-rs]: https://docs.rs/protoc-prebuilt
[docs-rs-shields]: https://img.shields.io/docsrs/protoc-prebuilt
[license]: https://github.com/sergeiivankov/protoc-prebuilt/blob/main/license
[license-shields]: https://img.shields.io/github/license/sergeiivankov/protoc-prebuilt
Protobuf compiler `protoc` pre-built binaries installer.
Installed binaries stored in `OUT_DIR` of the crate using the library.
## Usage
Library export `init` function which takes `version` parameter. Version parameter should be a tag name from protobuf repository without `v` prefix, for example, "21.12" or "22.0-rc3" (see [protobuf repository tags](https://github.com/protocolbuffers/protobuf/tags)). Function return a tuple contains paths to `protoc` binary and `include` directory.
In next examples provided `build.rs` script content for different generators. For example, we have next simplified project structure with protobuf files:
```text
src/
proto/
apple.proto
orange.proto
build.rs
```
With [prost-build](https://crates.io/crates/prost-build):
```rust,no_run
use prost_build::compile_protos;
use protoc_prebuilt::init;
use std::env::set_var;
fn main() {
let (protoc_bin, _) = init("22.0").unwrap();
set_var("PROTOC", protoc_bin);
compile_protos(
&["src/proto/apple.proto", "src/proto/orange.proto"],
&["src/proto"]
).unwrap();
}
```
With [protobuf-codegen](https://crates.io/crates/protobuf-codegen):
```rust,no_run
use protobuf_codegen::Codegen;
use protoc_prebuilt::init;
use std::env::set_var;
fn main() {
let (protoc_bin, _) = init("22.0").unwrap();
Codegen::new()
.protoc()
.protoc_path(&protoc_bin)
.includes(&["src/proto"])
.inputs(&["src/proto/apple.proto", "src/proto/orange.proto"])
.cargo_out_dir("proto")
.run_from_script();
}
```
## GitHub API limits
To avoid GitHub API limits library add `Authorization` header to requests to API with `GITHUB_TOKEN` environment variable content.
To prevent this behavior, set `PROTOC_PREBUILT_NOT_ADD_GITHUB_TOKEN` environment variable to any value reduced to `true` (see `var_bool` function in sources).
To force this library to use autorization token from another environment variable, set its name to `PROTOC_PREBUILT_GITHUB_TOKEN_ENV_NAME` environment variable.
## Using custom protobuf installation
If you have custom protobuf installation and need to use this installed version, use next environment variables to change default behavior:
- `PROTOC_PREBUILT_FORCE_PROTOC_PATH` to set force use path to `protoc` binary from value of this variable, if it variable exists, `protoc-prebuilt` not download protobuf from GitHub;
- `PROTOC_PREBUILT_FORCE_INCLUDE_PATH` to set force use path to `includes` directory from value of this variable, if it variable not exists, `protoc-prebuilt` calculate path to `includes` directory himself from `protoc` binary path depending on version (see `get_include_path` function in sources).
## Using HTTP proxy for request to GitHub API
For setup HTTP proxy `protoc-prebuilt` use environment variables same as [curl does it](https://everything.curl.dev/usingcurl/proxies/env). Library use `HTTP_PROXY`, `HTTPS_PROXY` and them lowercase analogues.
To disable proxy usage with `curl` agreement you can add `github.com` (to bypass proxy in asset downloading), `api.github.com` (to bypass proxy in version exists cheking), `.github.com` (to bypass proxy in both variants) to `NO_PROXY` or `no_proxy` environment variable.
To disable any use of proxy in `protoc-prebuilt` set `PROTOC_PREBUILT_NOT_USE_PROXY` environment variable to any value reduced to `true` (see `var_bool` function in sources).
## Version checking
After installation `protoc-prebuilt` run `protoc` binary with "--version" argument and compare result with required version. It need to make sure the installation is correct and check version of custom protobuf installation.
If you need disable this behavior, set `PROTOC_PREBUILT_NOT_CHECK_VERSION` environment variable to any value reduced to `true` (see `var_bool` function in sources).
## Comparison with analogues
- [protoc-bin-vendored](https://crates.io/crates/protoc-bin-vendored) store pre-built protobuf compiler in dependencies crates, so you can't use latest or specify version of compiler, if it's not provide by crate author;
- [protobuf-src](https://crates.io/crates/protobuf-src) build protobuf compiler from sources, it not support `windows` target and compilers versions hardcoded, so you can't use specify version.