fix(build): Prevent duplicated client/server generated code (#121)
* fix(build): Prevent duplicated client/server generated code The tonic-build process collects up RPC services as they are provided by prost, before writing them out as part of the finalization step for a given protocol buffer package. In the case of imported protocol buffer packages, there may be RPC services included by import in addition to those in the top-level package. Therefore it is necessary to make sure each set of client/server services gathered by tonic-build is cleared after the finalization process for a given protocol buffer package, otherwise they will be incorrectly aggregated as the generation process proceeds through the subsequent packages. * Test case for duplicated client/server generated code A simple test case that will fail to build without a fix to prevent RPC services being duplicated into inappropriate modules (that related to particular protocol buffer packages). * Additional test case for included_service Introduces an additional case that captures making sure services defined before including a package with additional services doesn't incidentially clear such precursor services from the including package. * Fix unnecessary newline to keep `cargo fmt` happy
This commit is contained in:
committed by
Lucio Franco
parent
4d4dbdf074
commit
b02b4b238b
@@ -5,6 +5,7 @@ members = [
|
|||||||
"tonic-examples",
|
"tonic-examples",
|
||||||
"tonic-interop",
|
"tonic-interop",
|
||||||
|
|
||||||
|
"tests/included_service",
|
||||||
"tests/same_name",
|
"tests/same_name",
|
||||||
"tests/wellknown",
|
"tests/wellknown",
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -0,0 +1,16 @@
|
|||||||
|
[package]
|
||||||
|
name = "included_service"
|
||||||
|
version = "0.1.0"
|
||||||
|
authors = ["Lucio Franco <[email protected]>"]
|
||||||
|
edition = "2018"
|
||||||
|
publish = false
|
||||||
|
|
||||||
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
tonic = { path = "../../tonic" }
|
||||||
|
bytes = "0.4"
|
||||||
|
prost = "0.5"
|
||||||
|
|
||||||
|
[build-dependencies]
|
||||||
|
tonic-build = { path = "../../tonic-build" }
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
fn main() {
|
||||||
|
tonic_build::compile_protos("proto/includer.proto").unwrap();
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
syntax = "proto3";
|
||||||
|
|
||||||
|
package includee;
|
||||||
|
|
||||||
|
service Included {
|
||||||
|
rpc SomeMethod(SomeRequest) returns (SomeResponse) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
message SomeRequest {}
|
||||||
|
|
||||||
|
message SomeResponse {}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
syntax = "proto3";
|
||||||
|
|
||||||
|
package includer;
|
||||||
|
|
||||||
|
message TopMessage {}
|
||||||
|
|
||||||
|
service TopService {
|
||||||
|
rpc TopMethod(TopMessage) returns (TopMessage) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
import "includee.proto";
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
pub mod pb {
|
||||||
|
tonic::include_proto!("includer");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ensure that an RPC service, defined before including a file that defines
|
||||||
|
// another service in a different protocol buffer package, is not incorrectly
|
||||||
|
// cleared from the context of its package.
|
||||||
|
type _Test = dyn pb::server::TopService;
|
||||||
@@ -262,6 +262,8 @@ impl prost_build::ServiceGenerator for ServiceGenerator {
|
|||||||
|
|
||||||
let code = format!("{}", client_service);
|
let code = format!("{}", client_service);
|
||||||
buf.push_str(&code);
|
buf.push_str(&code);
|
||||||
|
|
||||||
|
self.clients = TokenStream::default();
|
||||||
}
|
}
|
||||||
|
|
||||||
if self.builder.build_server && !self.servers.is_empty() {
|
if self.builder.build_server && !self.servers.is_empty() {
|
||||||
@@ -279,6 +281,8 @@ impl prost_build::ServiceGenerator for ServiceGenerator {
|
|||||||
|
|
||||||
let code = format!("{}", server_service);
|
let code = format!("{}", server_service);
|
||||||
buf.push_str(&code);
|
buf.push_str(&code);
|
||||||
|
|
||||||
|
self.servers = TokenStream::default();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user