Как повторно использовать код из основной корзины в другой корзине?

Моя структура проекта выглядит так:

.
├── Cargo.lock
├── Cargo.toml
└── src
    ├── bin
    │   └── other.rs
    ├── main.rs
    └── util.rs

(код: https://gitlab.com/msrd0/cargo-bin-import )

В моем other.rs я пытаюсь повторно использовать код из мода util, который объявлен как общедоступный мод в моем main.rs файле. Я пробовал следующее:

  • use util::do_sth
  • use crate::util::do_sth
  • use cargo_bin_import::util::do_sth (с внешним ящиком и без него)
  • mod util; use util::do_sth
  • extern crate util; use util::do_sth (предложено rustc)

Ничего из вышеперечисленного не сработало и не дало мне сообщений об ошибках, подобных этому:

error[E0432]: unresolved import `crate::util`
 --> src/bin/other.rs:1:12
  |
1 | use crate::util::do_sth;
  |            ^^^^ maybe a missing `extern crate util;`?

error: aborting due to previous error

person msrd0    schedule 11.08.2019    source источник


Ответы (1)


Используйте библиотеку и два двоичных файла, а затем повторно используйте код библиотеки в двух двоичных файлах. Пример:

Cargo.toml

[lib]
name = "utils"
path = "src/utils.rs"

# cargo build --bin other
[[bin]]
name = "other"
path = "src/bin/other.rs"

# cargo build --bin main
[[bin]]
name = "main"
path = "src/main.rs"

Тогда use utils::{...}. Путь взят из вашего вопроса, но размещение main внутри bin / и переименование utils.rs в lib.rs может быть более стандартным способом сделать это.

Если библиотека достаточно универсальна, вы можете даже выпустить ее на crates.io, чтобы другие могли извлечь из нее пользу.

person AdminXVII    schedule 11.08.2019