tonic
tonic copied to clipboard
Add ability to specify import path instead of hardcode to `tonic-build` codegen
Feature Request
Add ability to specify path to tonic and async_trait imports when referenced in codegen.
Crates
tonic-build
Motivation
I keep tonic and many other dependencies in a separate package. When I import them into a package that uses tonic-build to generate Rust proto, I get an error saying tonic and async_trait cannot be found.
Currently, the only way to use tonic is a direct dependency of the main package not as an import from another package. I haven't come across this issue with other packages. Serde has "crate" container attribute that solves theirs.
Proposal
Add a new method to the tonic_build::configure() -> Config Builder trait.
Alternatives
The alternative way is I clone the repo and hardcode the correct import path.
I don't follow. Why can't you depend on tonic for the crate that includes the compiled protos?
If I import tonic and prost from another package, the codegen does not find the modules

However, if I include tonic and prost in the same package that compiles protos, it works

I don't know why that is.
I suppose that is because the client and server codegen nests things in modules. See https://github.com/hyperium/tonic/blob/master/tonic-build/src/server.rs#L67 and https://github.com/hyperium/tonic/blob/master/tonic-build/src/client.rs#L25.
I wonder if adding use super::* to the generated modules would fix it or if a crate config similar to serde's is necessary.
Yes if I refer to tonic as crate::tonic::codegen::*, it works but prost doesn't.
It uses :: (https://github.com/tokio-rs/prost/blob/master/prost-build/src/code_generator.rs#L177) which isn't going to work in this Rust-2018 project according to https://doc.rust-lang.org/reference/visibility-and-privacy.html#pubin-path-pubcrate-pubsuper-and-pubself
Do you have a simple reproduction of your issue? I am not totally following what the issue is.