3

私は 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.rsclientpub mod common;

このプロジェクトのようにモデル化するために見つけた1つの潜在的な解決策ですが、これにはすべてのフォルダーに必要であり、Cargo.toml避けたいものです。

近くにいるような気がしますが、何かが欠けています。

4

1 に答える 1

1

あなたはcommon今、クレートとして構築していません。ビルドされるクレートはライブラリclientserver(ライブラリのデフォルト名はパッケージ名) とバイナリclientおよびserver.

通常、extern crate clientserver;動作するはずです。ただし、ライブラリに別の名前を付けたい場合は[lib]、 Cargo.toml のセクションで別の名前を指定することで実行できます。このセクションでは、ライブラリのメイン ソース ファイルに別のソース パスを指定することもできます。あなたの場合、それはおそらくより良いでしょcommonう。たとえば、これを Cargo.toml に追加します。commoncommon::common::foo

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

src/lib.rssrc/common/mod.rsを組み合わせることができますsrc/common/lib.rs。次に、extern crate common;バイナリで動作するはずです。

于 2016-09-26T00:12:08.140 に答える