私は Rust を学んでいて、単純なクライアント/サーバー プログラムを作成することにしました。クライアントとサーバーの両方が、既に作成した非常に単純なモジュールを使用します。このコードが大きくなる可能性があることを知っていたので、わかりやすくするためにソースを区分することにしました。現在、私の現在の階層は次のようになります。
├── Cargo.lock
├── Cargo.toml
├── README.md
├── src
│ ├── client
│ │ └── main.rs
│ ├── common
│ │ ├── communicate.rs
│ │ └── mod.rs
│ ├── lib.rs
│ └── server
│ └── main.rs
スタック オーバーフローとネットで見つけた例の多くは 、プロジェクトのルート ディレクトリにある場合の優れたサンプルを提供します。残念ながら、上記のように別のことをしようとしています。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"
また、(を使用して)コンテンツにaをextern crate...
追加しようとしましたが、最初と同じエラーが引き続き発生します。lib.rs
client
pub mod common;
このプロジェクトのようにモデル化するために見つけた1つの潜在的な解決策ですが、これにはすべてのフォルダーに必要であり、Cargo.toml
避けたいものです。
近くにいるような気がしますが、何かが欠けています。