Рефакторинг структуры рабочей области приводит к тому, что импорт внешних ящиков не работает.

avatar
Phoenix
7 апреля 2018 в 23:08
745
1
0

Мне нужно, чтобы разные части моего проекта использовали разные версии одного и того же внешнего крейта, поэтому я реорганизую свой проект Rust, чтобы разделить его на несколько пакетов через систему рабочих областей, используя это в качестве руководства. Это приводит к тому, что импорт всех внешних ящиков паба не работает.

Этот пост очень похож на тот, который я создал совсем недавно, а затем удалил — эта версия содержит минимальный, полный и поддающийся проверке пример.

Вот структура моего проекта

workspace_test/
  root/
    src/
      main.rs
    Cargo.toml
  Cargo.toml

workspace_test/Cargo.toml:

[package]
name = "workspace_test"
version = "0.1.0"
authors = ["Phoenix <kahlo.phoenix@gmail.com>"]

[workspace]
members = [
    "root"
]

[[bin]]
name = "root"
path = "root/src/main.rs"

workspace_test/root/Cargo.toml:

[package]
name = "root"
version = "0.1.0"
authors = ["Phoenix <kahlo.phoenix@gmail.com>"]

[dependencies]
time = "0.1"

workspace_test/root/src/main.rs:

pub extern crate time;

fn main() {
    println!("Hello, world!");
}

Это также находится на github, так что его можно легко клонировать и cargo rund.

Это ошибка:

error[E0463]: can't find crate for `time`
 --> root/src/main.rs:1:1
  |
1 | pub extern crate time;
  | ^^^^^^^^^^^^^^^^^^^^^^ can't find crate

error: aborting due to previous error

error: Could not compile `workspace_test`.
Источник

Ответы (1)

avatar
Tim Diekmann
7 апреля 2018 в 23:42
2

В workspace_test/Cargo.toml вы создаете пакет с двоичным файлом root. Если вы выполните cargo run, он запустит main.rs, но, поскольку вы не указали зависимости в этом файле манифеста, возникает ошибка. Зависимость указана только в workspace_test/root/Cargo.toml, который в данный момент не используется.

Я предполагаю, что вы хотите использовать рабочие пространства, предложенные RFC. Вы можете создать рабочую область с виртуальными манифестами, которые не должны указывать ни [package], ни [[bin]], поэтому просто удалите их. workspace_test/Cargo.toml теперь выглядит так:

[workspace]
members = [
    "root"
]

Если у вас есть только один исполняемый файл, теперь вы можете передать пакет: -p/--package

cargo run -p root

или укажите путь к манифесту вручную:

cargo run --manifest-path root/Cargo.toml

Если root/Cargo.toml содержит несколько целей, вы можете просто добавить флаги --lib или --bin, как обычно. Например. это выполнит двоичный файл abc, указанный в workspace_test/root/Cargo.toml:

.
cargo run -p root --bin abc