Импорт модуля без полномочий root из нескольких двоичных файлов без полномочий root
Я изучаю Rust и решил написать простую клиент-серверную программу. И клиент, и сервер будут использовать очень простой модуль, который я уже написал. Зная, что этот код может расти, я решил разделить мой источник для ясности. Прямо сейчас моя текущая иерархия выглядит следующим образом:
├── Cargo.lock
├── Cargo.toml
├── README.md
├── src
│ ├── client
│ │ └── main.rs
│ ├── common
│ │ ├── communicate.rs
│ │ └── mod.rs
│ ├── lib.rs
│ └── server
│ └── main.rs
Многие из примеров, которые я нашел в Stack Overflow и в сети, дают отличные примеры того, когда main.rs
находится в корневом каталоге проекта. К сожалению, я пытаюсь сделать что-то другое, как показано выше.
communicate.rs
содержит весь сетевой код, который я написал. Со временем я добавлю сюда другие файлы Rust и включу их public mod
заявление в mod.rs
, В настоящее время common/mod.rs
все что у меня есть pub mod communicate;
Сосредоточение внимания только на client
папка, все что у меня есть main.rs
как показано. Файл "заголовок" списков
extern crate common;
use std::thread;
use std::time;
use std::net;
use std::mem;
use common::communicate;
pub fn main() {
// ...
}
Помимо фундаментального [package]
раздел, все, что я имею в Cargo.toml
является
[[bin]]
name = "server"
path = "src/server/main.rs"
[[bin]]
name = "client"
path = "src/client/main.rs"
Когда я пытаюсь собрать двоичный файл клиента, компилятор жалуется, что common
ящик не может быть найден.
$ cargo build
Compiling clientserver v0.1.0 (file:///home/soplu/rust/RustClientServer)
client/main.rs:1:1: 1:21 error: can't find crate for `common` [E0463]
client/main.rs:1 extern crate common;
^~~~~~~~~~~~~~~~~~~~
error: aborting due to previous error
error: Could not compile `clientserver`.
To learn more, run the command again with --verbose.
Я думаю, что это потому, что он ищет общий ящик внутри client/
папка. У меня была такая же проблема, когда я пытался mod
заявление вместо extern crate
заявление.
use std::thread;
use std::time;
use std::net;
use std::mem;
mod common;
Дал мне:
client/main.rs:6:5: 6:11 error: file not found for module `common`
client/main.rs:6 mod common;
^~~~~~
client/main.rs:6:5: 12:11 help: name the file either common.rs or common/mod.rs inside the directory "client"
Я также пытался (используя extern crate...
) добавив lib.rs
в client
чье содержимое pub mod common;
но я все равно получаю ту же ошибку, что и первая.
Одно потенциальное решение, которое я нашел, чтобы смоделировать его как этот проект, но это потребовало бы Cargo.toml
в каждой папке, то, что я хотел бы избежать.
Я чувствую, что я рядом, но что-то упустил.
1 ответ
Вы не строите common
как ящик прямо сейчас. Ящики строятся в библиотеке clientserver
(именем библиотеки по умолчанию является имя пакета) и двоичные файлы client
а также server
,
Обычно, extern crate clientserver;
должно сработать. Однако, если вы хотите назвать свою библиотеку по-другому, вы можете сделать это, указав другое имя в [lib]
раздел в Cargo.toml. В этом разделе вы также можете указать другой исходный путь для основного исходного файла библиотеки. В вашем случае, вероятно, будет лучше, в противном случае вы получите ящик с именем common
и все его содержимое будет в модуле с именем common
так что вам нужно получить доступ ко всему как common::common::foo
, Например, добавив это в ваш Cargo.toml:
[lib]
name = "common"
path = "src/common/lib.rs"
Вы могли бы объединить src/lib.rs
а также src/common/mod.rs
в src/common/lib.rs
, Затем, extern crate common;
должен работать в ваших двоичных файлах.