Почему замена атрибута version и path зависимости на git-хеш вызывает ошибку компиляции? - PullRequest
0 голосов
/ 24 марта 2019

У меня странная проблема с зависимостями. Вот шаги для воспроизведения:

❯ rustc -V
rustc 1.35.0-nightly (82e2f3ec2 2019-03-20)

❯ git clone https://github.com/google/tarpc.git
❯ cd tarpc/example-service

❯ cargo build
    Finished dev [unoptimized + debuginfo] target(s) in 0.13s

❯ git rev-parse HEAD
06544faa5a0872d4be989451afc0a2b1e1278df4

Теперь я заменяю строку в Cargo.toml с

bincode-transport = { package = "tarpc-bincode-transport", version = "0.3", path = "../bincode-transport" }

до

bincode-transport = { package = "tarpc-bincode-transport", git="https://github.com/google/tarpc.git", rev="06544faa5a0872d4be989451afc0a2b1e1278df4" }

, представляющий ту же кодовую базу (я думаю, version = 0.3 не имеет смысла),

Тогда у меня ошибка сборки

❯ cargo build
    Blocking waiting for file lock on the git checkouts
    Updating git repository `https://github.com/google/tarpc.git`
   Compiling tarpc-example-service v0.2.0 (tarpc/example-service)
error[E0277]: the trait bound `tarpc_bincode_transport::Transport<tokio_tcp::stream::TcpStream, _, _>: tarpc_lib::transport::Transport` is not satisfied
  --> example-service/src/server.rs:45:4
   |
45 |         .incoming(transport)
   |          ^^^^^^^^ the trait `tarpc_lib::transport::Transport` is not implemented for `tarpc_bincode_transport::Transport<tokio_tcp::stream::TcpStream, _, _>`

error[E0277]: the trait bound `tarpc_bincode_transport::Transport<tokio_tcp::stream::TcpStream, _, _>: tarpc_lib::transport::Transport` is not satisfied
  --> example-service/src/client.rs:20:29
   |
20 |     let mut client = await!(service::new_stub(client::Config::default(), transport))?;
   |                             ^^^^^^^^^^^^^^^^^ the trait `tarpc_lib::transport::Transport` is not implemented for `tarpc_bincode_transport::Transport<tokio_tcp::stream::TcpStream, _, _>`
   |
   = note: required by `service::new_stub`

error: aborting due to previous error

For more information about this error, try `rustc --explain E0277`.
error: Could not compile `tarpc-example-service`.
warning: build failed, waiting for other jobs to finish...
error[E0599]: no method named `respond_with` found for type `impl futures_core::stream::Stream` in the current scope
  --> example-service/src/server.rs:48:4
   |
48 |         .respond_with(service::serve(HelloServer));
   |          ^^^^^^^^^^^^
   |
   = note: the method `respond_with` exists but the following trait bounds were not satisfied:
           `&impl futures_core::stream::Stream : tarpc_lib::server::Handler<_, _, _>`
           `&mut impl futures_core::stream::Stream : tarpc_lib::server::Handler<_, _, _>`
           `impl futures_core::stream::Stream : tarpc_lib::server::Handler<_, _, _>`

error: aborting due to 2 previous errors

Some errors occurred: E0277, E0599.
For more information about an error, try `rustc --explain E0277`.
error: Could not compile `tarpc-example-service`.

cargo clean не помогло. Как это возможно?

1 Ответ

4 голосов
/ 24 марта 2019

Это та же проблема, что и Почему черта не реализована для типа, который явно ее реализовал? - путем добавления и версии кода git и локальной версия кода (через tarpc = { path = "../tarpc" }), вы компилируете ящик tarpc два раза. Черты каждого из них не совпадают, они фактически являются разными версиями одного ящика.

Это можно проверить с помощью cargo tree -d -i:

tarpc-lib v0.2.0 (https://github.com/google/tarpc.git?rev=06544faa5a0872d4be989451afc0a2b1e1278df4#06544faa)
└── tarpc-bincode-transport v0.3.0 (https://github.com/google/tarpc.git?rev=06544faa5a0872d4be989451afc0a2b1e1278df4#06544faa)
    └── tarpc-example-service v0.2.0 (/private/tmp/tarpc/example-service)

tarpc-lib v0.2.0 (/private/tmp/tarpc/rpc)
└── tarpc v0.14.1 (/private/tmp/tarpc/tarpc)
    └── tarpc-example-service v0.2.0 (/private/tmp/tarpc/example-service)

tarpc-trace v0.1.0 (https://github.com/google/tarpc.git?rev=06544faa5a0872d4be989451afc0a2b1e1278df4#06544faa)
└── tarpc-lib v0.2.0 (https://github.com/google/tarpc.git?rev=06544faa5a0872d4be989451afc0a2b1e1278df4#06544faa)
    └── tarpc-bincode-transport v0.3.0 (https://github.com/google/tarpc.git?rev=06544faa5a0872d4be989451afc0a2b1e1278df4#06544faa)
        └── tarpc-example-service v0.2.0 (/private/tmp/tarpc/example-service)

tarpc-trace v0.1.0 (/private/tmp/tarpc/trace)
└── tarpc-lib v0.2.0 (/private/tmp/tarpc/rpc)
    └── tarpc v0.14.1 (/private/tmp/tarpc/tarpc)
        └── tarpc-example-service v0.2.0 (/private/tmp/tarpc/example-service)

Если вы постоянно используете версию из git, она будет работать:

tarpc = { git = "https://github.com/google/tarpc.git", rev = "06544faa5a0872d4be989451afc0a2b1e1278df4", features = ["serde1"] }
...