tonic icon indicating copy to clipboard operation
tonic copied to clipboard

Add ability to specify import path instead of hardcode to `tonic-build` codegen

Open lilses opened this issue 3 years ago • 5 comments

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.

lilses avatar Jul 07 '21 18:07 lilses

I don't follow. Why can't you depend on tonic for the crate that includes the compiled protos?

davidpdrsn avatar Jul 07 '21 18:07 davidpdrsn

If I import tonic and prost from another package, the codegen does not find the modules image

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

I don't know why that is.

ghost avatar Jul 07 '21 20:07 ghost

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.

davidpdrsn avatar Jul 07 '21 20:07 davidpdrsn

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

ghost avatar Jul 07 '21 22:07 ghost

Do you have a simple reproduction of your issue? I am not totally following what the issue is.

LucioFranco avatar Sep 17 '21 15:09 LucioFranco