tonic icon indicating copy to clipboard operation
tonic copied to clipboard

Helloworld tutorial is outdated?

Open zhiburt opened this issue 2 years ago • 13 comments

https://github.com/hyperium/tonic/blob/master/examples/helloworld-tutorial.md

Following the reference I was getting

error: environment variable `OUT_DIR` not defined
 --> src/server.rs:9:5
  |
9 |     tonic::include_proto!("helloworld");
  |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Then I took a look at build.rs used in examples dir and in a bit different.

And to fix it it was necessary to change a build.rs and Cargo.toml.

    let out_dir = PathBuf::from(env::var("OUT_DIR").unwrap());
    tonic_build::configure()
        .file_descriptor_set_path(out_dir.join("helloworld_descriptor.bin"))
        .compile(&["proto/helloworld/helloworld.proto"], &["proto"])
        .unwrap();
# include `prost`
[dependencies]
prost = "*"

# include `prost`
[build-dependencies]
tonic-build = { path = "../tonic-build", features = ["prost"] }

zhiburt avatar Sep 15 '21 15:09 zhiburt

Rust build scripts are being expected to be in the root folder, i.e a sibling folder to src. Cargo then will set OUT_DIR for the compiler to use. So if you insist to move the build script somewhere else, you'll have to set it manually. But if you are willing to put it there, it still works, so the tutorial is correct.

CommoDor64 avatar Sep 17 '21 11:09 CommoDor64

Rust build scripts are being expected to be in the root folder, i.e a sibling folder to src. Cargo then will set OUT_DIR for the compiler to use.

That's right but as I remember there will be an erorr because of prost dependency.

I mean that In the tutorial there's snippets like these.

    // don't remember func name
    tonic_build::.compile_prots("proto/helloworld.proto").unwrap();
# include `prost`
[dependencies]

# include `prost`
[build-dependencies]
tonic-build = { path = "../tonic-build", features = [] }

And I was getting errors unless I changed them to the following (Which I found in your examples folder)

    let out_dir = PathBuf::from(env::var("OUT_DIR").unwrap());
    tonic_build::configure()
        .file_descriptor_set_path(out_dir.join("helloworld_descriptor.bin"))
        .compile(&["proto/helloworld.proto"], &["proto"])
        .unwrap();
# include `prost`
[dependencies]
prost = "*"

# include `prost`
[build-dependencies]
tonic-build = { path = "../tonic-build", features = ["prost"] }

zhiburt avatar Sep 17 '21 12:09 zhiburt

To be precise here it is

When you keep things as described in tutorial

https://github.com/hyperium/tonic/blame/master/examples/helloworld-tutorial.md#L101-L122

https://github.com/hyperium/tonic/blame/master/examples/helloworld-tutorial.md#L130-L134

error[E0433]: failed to resolve: could not find `prost` in the list of imported crates
 --> /home/mzhiburt/projects/tonic/target/debug/build/examples-020cf5705affc3b4/out/helloworld.rs:8:30
  |
8 | #[derive(Clone, PartialEq, ::prost::Message)]
  |                              ^^^^^ could not find `prost` in the list of imported crates

error[E0433]: failed to resolve: could not find `prost` in the list of imported crates
 --> /home/mzhiburt/projects/tonic/target/debug/build/examples-020cf5705affc3b4/out/helloworld.rs:2:30
  |
2 | #[derive(Clone, PartialEq, ::prost::Message)]
  |                              ^^^^^ could not find `prost` in the list of imported crates

error: cannot find attribute `prost` in this scope
 --> /home/mzhiburt/projects/tonic/target/debug/build/examples-020cf5705affc3b4/out/helloworld.rs:4:7
  |
4 |     #[prost(string, tag = "1")]
  |       ^^^^^

error: cannot find attribute `prost` in this scope
  --> /home/mzhiburt/projects/tonic/target/debug/build/examples-020cf5705affc3b4/out/helloworld.rs:10:7
   |
10 |     #[prost(string, tag = "1")]
   |       ^^^^^

error[E0433]: failed to resolve: could not find `prost` in the list of imported crates
 --> /home/mzhiburt/projects/tonic/target/debug/build/examples-020cf5705affc3b4/out/helloworld.rs:5:17
  |
5 |     pub name: ::prost::alloc::string::String,
  |                 ^^^^^ could not find `prost` in the list of imported crates

error[E0433]: failed to resolve: could not find `prost` in the list of imported crates
  --> /home/mzhiburt/projects/tonic/target/debug/build/examples-020cf5705affc3b4/out/helloworld.rs:11:20
   |
11 |     pub message: ::prost::alloc::string::String,
   |                    ^^^^^ could not find `prost` in the list of imported crates

error[E0277]: the trait bound `HelloRequest: prost::message::Message` is not satisfied
  --> /home/mzhiburt/projects/tonic/target/debug/build/examples-020cf5705affc3b4/out/helloworld.rs:87:24
   |
87 |             self.inner.unary(request.into_request(), path, codec).await
   |                        ^^^^^ the trait `prost::message::Message` is not implemented for `HelloRequest`
   |
   = note: required because of the requirements on the impl of `Codec` for `ProstCodec<HelloRequest, _>`

error[E0277]: the trait bound `HelloReply: prost::message::Message` is not satisfied
  --> /home/mzhiburt/projects/tonic/target/debug/build/examples-020cf5705affc3b4/out/helloworld.rs:87:24
   |
87 |             self.inner.unary(request.into_request(), path, codec).await
   |                        ^^^^^ the trait `prost::message::Message` is not implemented for `HelloReply`
   |
   = note: required because of the requirements on the impl of `Codec` for `ProstCodec<HelloRequest, HelloReply>`

error[E0277]: the trait bound `HelloReply: Default` is not satisfied
  --> /home/mzhiburt/projects/tonic/target/debug/build/examples-020cf5705affc3b4/out/helloworld.rs:87:24
   |
87 |             self.inner.unary(request.into_request(), path, codec).await
   |                        ^^^^^ the trait `Default` is not implemented for `HelloReply`
   |
   = note: required because of the requirements on the impl of `Codec` for `ProstCodec<HelloRequest, HelloReply>`

error[E0277]: the trait bound `HelloReply: prost::message::Message` is not satisfied
   --> /home/mzhiburt/projects/tonic/target/debug/build/examples-020cf5705affc3b4/out/helloworld.rs:170:40
    |
170 |                         let res = grpc.unary(method, req).await;
    |                                        ^^^^^ the trait `prost::message::Message` is not implemented for `HelloReply`
    |
    = note: required because of the requirements on the impl of `Codec` for `ProstCodec<HelloReply, HelloRequest>`

error[E0277]: the trait bound `HelloRequest: prost::message::Message` is not satisfied
   --> /home/mzhiburt/projects/tonic/target/debug/build/examples-020cf5705affc3b4/out/helloworld.rs:170:40
    |
170 |                         let res = grpc.unary(method, req).await;
    |                                        ^^^^^ the trait `prost::message::Message` is not implemented for `HelloRequest`
    |
    = note: required because of the requirements on the impl of `Codec` for `ProstCodec<HelloReply, HelloRequest>`

error[E0277]: the trait bound `HelloRequest: Default` is not satisfied
   --> /home/mzhiburt/projects/tonic/target/debug/build/examples-020cf5705affc3b4/out/helloworld.rs:170:40
    |
170 |                         let res = grpc.unary(method, req).await;
    |                                        ^^^^^ the trait `Default` is not implemented for `HelloRequest`
    |
    = note: required because of the requirements on the impl of `Codec` for `ProstCodec<HelloReply, HelloRequest>`

error[E0277]: the trait bound `HelloReply: prost::message::Message` is not satisfied
   --> /home/mzhiburt/projects/tonic/target/debug/build/examples-020cf5705affc3b4/out/helloworld.rs:166:72
    |
166 |                         let mut grpc = tonic::server::Grpc::new(codec).apply_compression_config(
    |                                                                        ^^^^^^^^^^^^^^^^^^^^^^^^ the trait `prost::message::Message` is not implemented for `HelloReply`
    |
    = note: required because of the requirements on the impl of `Codec` for `ProstCodec<HelloReply, HelloRequest>`

error[E0277]: the trait bound `HelloRequest: prost::message::Message` is not satisfied
   --> /home/mzhiburt/projects/tonic/target/debug/build/examples-020cf5705affc3b4/out/helloworld.rs:166:72
    |
166 |                         let mut grpc = tonic::server::Grpc::new(codec).apply_compression_config(
    |                                                                        ^^^^^^^^^^^^^^^^^^^^^^^^ the trait `prost::message::Message` is not implemented for `HelloRequest`
    |
    = note: required because of the requirements on the impl of `Codec` for `ProstCodec<HelloReply, HelloRequest>`

error[E0277]: the trait bound `HelloRequest: Default` is not satisfied
   --> /home/mzhiburt/projects/tonic/target/debug/build/examples-020cf5705affc3b4/out/helloworld.rs:166:72
    |
166 |                         let mut grpc = tonic::server::Grpc::new(codec).apply_compression_config(
    |                                                                        ^^^^^^^^^^^^^^^^^^^^^^^^ the trait `Default` is not implemented for `HelloRequest`
    |
    = note: required because of the requirements on the impl of `Codec` for `ProstCodec<HelloReply, HelloRequest>`

error[E0277]: the trait bound `HelloReply: prost::message::Message` is not satisfied
   --> /home/mzhiburt/projects/tonic/target/debug/build/examples-020cf5705affc3b4/out/helloworld.rs:166:40
    |
166 |                         let mut grpc = tonic::server::Grpc::new(codec).apply_compression_config(
    |                                        ^^^^^^^^^^^^^^^^^^^^^^^^ the trait `prost::message::Message` is not implemented for `HelloReply`
    |
    = note: required because of the requirements on the impl of `Codec` for `ProstCodec<HelloReply, HelloRequest>`

error[E0277]: the trait bound `HelloRequest: prost::message::Message` is not satisfied
   --> /home/mzhiburt/projects/tonic/target/debug/build/examples-020cf5705affc3b4/out/helloworld.rs:166:40
    |
166 |                         let mut grpc = tonic::server::Grpc::new(codec).apply_compression_config(
    |                                        ^^^^^^^^^^^^^^^^^^^^^^^^ the trait `prost::message::Message` is not implemented for `HelloRequest`
    |
    = note: required because of the requirements on the impl of `Codec` for `ProstCodec<HelloReply, HelloRequest>`

error[E0277]: the trait bound `HelloRequest: Default` is not satisfied
   --> /home/mzhiburt/projects/tonic/target/debug/build/examples-020cf5705affc3b4/out/helloworld.rs:166:40
    |
166 |                         let mut grpc = tonic::server::Grpc::new(codec).apply_compression_config(
    |                                        ^^^^^^^^^^^^^^^^^^^^^^^^ the trait `Default` is not implemented for `HelloRequest`
    |
    = note: required because of the requirements on the impl of `Codec` for `ProstCodec<HelloReply, HelloRequest>`

error: aborting due to 18 previous errors

Some errors have detailed explanations: E0277, E0433.
For more information about an error, try `rustc --explain E0277`.
error: could not compile `examples`

To learn more, run the command again with --verbose.

zhiburt avatar Sep 17 '21 21:09 zhiburt

I don't really see what is missing in the tutorial, but I would accept a PR with suggestions you might have.

LucioFranco avatar Oct 13 '21 21:10 LucioFranco

To be precise here it is

When you keep things as described in tutorial

https://github.com/hyperium/tonic/blame/master/examples/helloworld-tutorial.md#L101-L122

https://github.com/hyperium/tonic/blame/master/examples/helloworld-tutorial.md#L130-L134

error[E0433]: failed to resolve: could not find `prost` in the list of imported crates
 --> /home/mzhiburt/projects/tonic/target/debug/build/examples-020cf5705affc3b4/out/helloworld.rs:8:30
  |
8 | #[derive(Clone, PartialEq, ::prost::Message)]
  |                              ^^^^^ could not find `prost` in the list of imported crates

error[E0433]: failed to resolve: could not find `prost` in the list of imported crates
 --> /home/mzhiburt/projects/tonic/target/debug/build/examples-020cf5705affc3b4/out/helloworld.rs:2:30
  |
2 | #[derive(Clone, PartialEq, ::prost::Message)]
  |                              ^^^^^ could not find `prost` in the list of imported crates

error: cannot find attribute `prost` in this scope
 --> /home/mzhiburt/projects/tonic/target/debug/build/examples-020cf5705affc3b4/out/helloworld.rs:4:7
  |
4 |     #[prost(string, tag = "1")]
  |       ^^^^^

error: cannot find attribute `prost` in this scope
  --> /home/mzhiburt/projects/tonic/target/debug/build/examples-020cf5705affc3b4/out/helloworld.rs:10:7
   |
10 |     #[prost(string, tag = "1")]
   |       ^^^^^

error[E0433]: failed to resolve: could not find `prost` in the list of imported crates
 --> /home/mzhiburt/projects/tonic/target/debug/build/examples-020cf5705affc3b4/out/helloworld.rs:5:17
  |
5 |     pub name: ::prost::alloc::string::String,
  |                 ^^^^^ could not find `prost` in the list of imported crates

error[E0433]: failed to resolve: could not find `prost` in the list of imported crates
  --> /home/mzhiburt/projects/tonic/target/debug/build/examples-020cf5705affc3b4/out/helloworld.rs:11:20
   |
11 |     pub message: ::prost::alloc::string::String,
   |                    ^^^^^ could not find `prost` in the list of imported crates

error[E0277]: the trait bound `HelloRequest: prost::message::Message` is not satisfied
  --> /home/mzhiburt/projects/tonic/target/debug/build/examples-020cf5705affc3b4/out/helloworld.rs:87:24
   |
87 |             self.inner.unary(request.into_request(), path, codec).await
   |                        ^^^^^ the trait `prost::message::Message` is not implemented for `HelloRequest`
   |
   = note: required because of the requirements on the impl of `Codec` for `ProstCodec<HelloRequest, _>`

error[E0277]: the trait bound `HelloReply: prost::message::Message` is not satisfied
  --> /home/mzhiburt/projects/tonic/target/debug/build/examples-020cf5705affc3b4/out/helloworld.rs:87:24
   |
87 |             self.inner.unary(request.into_request(), path, codec).await
   |                        ^^^^^ the trait `prost::message::Message` is not implemented for `HelloReply`
   |
   = note: required because of the requirements on the impl of `Codec` for `ProstCodec<HelloRequest, HelloReply>`

error[E0277]: the trait bound `HelloReply: Default` is not satisfied
  --> /home/mzhiburt/projects/tonic/target/debug/build/examples-020cf5705affc3b4/out/helloworld.rs:87:24
   |
87 |             self.inner.unary(request.into_request(), path, codec).await
   |                        ^^^^^ the trait `Default` is not implemented for `HelloReply`
   |
   = note: required because of the requirements on the impl of `Codec` for `ProstCodec<HelloRequest, HelloReply>`

error[E0277]: the trait bound `HelloReply: prost::message::Message` is not satisfied
   --> /home/mzhiburt/projects/tonic/target/debug/build/examples-020cf5705affc3b4/out/helloworld.rs:170:40
    |
170 |                         let res = grpc.unary(method, req).await;
    |                                        ^^^^^ the trait `prost::message::Message` is not implemented for `HelloReply`
    |
    = note: required because of the requirements on the impl of `Codec` for `ProstCodec<HelloReply, HelloRequest>`

error[E0277]: the trait bound `HelloRequest: prost::message::Message` is not satisfied
   --> /home/mzhiburt/projects/tonic/target/debug/build/examples-020cf5705affc3b4/out/helloworld.rs:170:40
    |
170 |                         let res = grpc.unary(method, req).await;
    |                                        ^^^^^ the trait `prost::message::Message` is not implemented for `HelloRequest`
    |
    = note: required because of the requirements on the impl of `Codec` for `ProstCodec<HelloReply, HelloRequest>`

error[E0277]: the trait bound `HelloRequest: Default` is not satisfied
   --> /home/mzhiburt/projects/tonic/target/debug/build/examples-020cf5705affc3b4/out/helloworld.rs:170:40
    |
170 |                         let res = grpc.unary(method, req).await;
    |                                        ^^^^^ the trait `Default` is not implemented for `HelloRequest`
    |
    = note: required because of the requirements on the impl of `Codec` for `ProstCodec<HelloReply, HelloRequest>`

error[E0277]: the trait bound `HelloReply: prost::message::Message` is not satisfied
   --> /home/mzhiburt/projects/tonic/target/debug/build/examples-020cf5705affc3b4/out/helloworld.rs:166:72
    |
166 |                         let mut grpc = tonic::server::Grpc::new(codec).apply_compression_config(
    |                                                                        ^^^^^^^^^^^^^^^^^^^^^^^^ the trait `prost::message::Message` is not implemented for `HelloReply`
    |
    = note: required because of the requirements on the impl of `Codec` for `ProstCodec<HelloReply, HelloRequest>`

error[E0277]: the trait bound `HelloRequest: prost::message::Message` is not satisfied
   --> /home/mzhiburt/projects/tonic/target/debug/build/examples-020cf5705affc3b4/out/helloworld.rs:166:72
    |
166 |                         let mut grpc = tonic::server::Grpc::new(codec).apply_compression_config(
    |                                                                        ^^^^^^^^^^^^^^^^^^^^^^^^ the trait `prost::message::Message` is not implemented for `HelloRequest`
    |
    = note: required because of the requirements on the impl of `Codec` for `ProstCodec<HelloReply, HelloRequest>`

error[E0277]: the trait bound `HelloRequest: Default` is not satisfied
   --> /home/mzhiburt/projects/tonic/target/debug/build/examples-020cf5705affc3b4/out/helloworld.rs:166:72
    |
166 |                         let mut grpc = tonic::server::Grpc::new(codec).apply_compression_config(
    |                                                                        ^^^^^^^^^^^^^^^^^^^^^^^^ the trait `Default` is not implemented for `HelloRequest`
    |
    = note: required because of the requirements on the impl of `Codec` for `ProstCodec<HelloReply, HelloRequest>`

error[E0277]: the trait bound `HelloReply: prost::message::Message` is not satisfied
   --> /home/mzhiburt/projects/tonic/target/debug/build/examples-020cf5705affc3b4/out/helloworld.rs:166:40
    |
166 |                         let mut grpc = tonic::server::Grpc::new(codec).apply_compression_config(
    |                                        ^^^^^^^^^^^^^^^^^^^^^^^^ the trait `prost::message::Message` is not implemented for `HelloReply`
    |
    = note: required because of the requirements on the impl of `Codec` for `ProstCodec<HelloReply, HelloRequest>`

error[E0277]: the trait bound `HelloRequest: prost::message::Message` is not satisfied
   --> /home/mzhiburt/projects/tonic/target/debug/build/examples-020cf5705affc3b4/out/helloworld.rs:166:40
    |
166 |                         let mut grpc = tonic::server::Grpc::new(codec).apply_compression_config(
    |                                        ^^^^^^^^^^^^^^^^^^^^^^^^ the trait `prost::message::Message` is not implemented for `HelloRequest`
    |
    = note: required because of the requirements on the impl of `Codec` for `ProstCodec<HelloReply, HelloRequest>`

error[E0277]: the trait bound `HelloRequest: Default` is not satisfied
   --> /home/mzhiburt/projects/tonic/target/debug/build/examples-020cf5705affc3b4/out/helloworld.rs:166:40
    |
166 |                         let mut grpc = tonic::server::Grpc::new(codec).apply_compression_config(
    |                                        ^^^^^^^^^^^^^^^^^^^^^^^^ the trait `Default` is not implemented for `HelloRequest`
    |
    = note: required because of the requirements on the impl of `Codec` for `ProstCodec<HelloReply, HelloRequest>`

error: aborting due to 18 previous errors

Some errors have detailed explanations: E0277, E0433.
For more information about an error, try `rustc --explain E0277`.
error: could not compile `examples`

To learn more, run the command again with --verbose.

I have the same problem, I solve it , add prost = "0.8" to cargo.toml

small-lei avatar Oct 19 '21 02:10 small-lei

I don't really see what is missing in the tutorial,

That's what I meant (I guess), that probably it makes sense to note or make it more clear that as @small-lei mentioned

I have the same problem, I solve it , add prost = "0.8" to cargo.toml

prost dependency is required.

zhiburt avatar Oct 19 '21 14:10 zhiburt

The prost thing is known https://github.com/hyperium/tonic/pull/791 👀

davidpdrsn avatar Oct 19 '21 14:10 davidpdrsn

Yeah this should be fixed on master right now and in the next release.

LucioFranco avatar Oct 19 '21 15:10 LucioFranco

Getting the same issue; following the helloworld tutorial example to the letter.

chokosabe avatar Aug 27 '22 17:08 chokosabe

@chokosabe can you post your cargo.toml file? The versions in the tutorial look fine to me.

LucioFranco avatar Aug 29 '22 14:08 LucioFranco

Same issue here after the routeguide tutorial. And I added the prost dep but the error is still there.

frederikhors avatar May 02 '23 17:05 frederikhors

Faced the same problem in helloworld turorial, Changed the prost and tonic_build versions and the project compiles

[package]
name = "helloworld-tonic"
version = "0.1.0"
edition = "2021"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[[bin]] # Bin to run the HelloWorld gRPC server
name = "helloworld-server"
path = "src/server.rs"

[[bin]] # Bin to run the HelloWorld gRPC client
name = "helloworld-client"
path = "src/client.rs"

[dependencies]
tonic = "0.7"
prost = "0.10"
tokio = { version = "1.0", features = ["macros", "rt-multi-thread"] }

[build-dependencies]
tonic-build = "0.7"

Narayanbhat166 avatar Sep 02 '23 16:09 Narayanbhat166

I solved it as follows: Looked at Cargo.lock and it was having multiple version of prost dependency like [[package]] name = "prost" version = "0.11.9"

[[package]] name = "prost" version = "0.8.0"

So seems like they are conflicting and right version is not getting picked. So I changed the dependencies of prost version to prost = "0.11.9" and it build successfully.

vishnu-kumar avatar Sep 06 '23 11:09 vishnu-kumar