Импорт модуля без полномочий 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; должен работать в ваших двоичных файлах.

Другие вопросы по тегам