2016-09-25 13 views
1

私はRustを学んでおり、単純なクライアント/サーバプログラムを書くことに決めました。クライアントとサーバーの両方は、すでに書いた非常に単純なモジュールを使用しています。このコードが成長するかもしれないことを知って、わかりやすく私のソースをコンパートメント化することに決めました。次のように今の私の現在の階層は見えます:main.rsは、プロジェクトのルートディレクトリにあるときに、私はスタックオーバーフローやネットで見つけ複数のルート以外のバイナリから非ルートモジュールをインポート

├── Cargo.lock 
├── Cargo.toml 
├── README.md 
├── src 
│   ├── client 
│   │   └── main.rs 
│   ├── common 
│   │   ├── communicate.rs 
│   │   └── mod.rs 
│   ├── lib.rs 
│   └── server 
│    └── main.rs 

Manyofthe例がために偉大なサンプルを提供します。残念ながら私は上記のように違うことをしようとしています。

communicate.rsには、私が書いたすべてのネットワークコードが含まれています。最終的に他のRustファイルを追加し、public modの文をmod.rsに含めます。現在、common/mod.rs私が持っているすべての pub mod communicate;

だけclientフォルダに焦点を当てている示したように、私が持っているすべてはmain.rsです。ファイル「ヘッダ」私はCargo.tomlに持っているすべては、私はクライアントのバイナリをビルドしようとすると、コンパイラはcommonクレートができなかったと文句を言い

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

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

で、基本的な[package]セクションのほかに

extern crate common; 

use std::thread; 
use std::time; 
use std::net; 
use std::mem; 

use common::communicate; 

pub fn main() { 
    // ... 
} 

を示しています見つけられた。

$ 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/フォルダ内の共通クレートを探しているので、これはあると思います。 extern crateステートメントの代わりにmodステートメントを試したとき、私は同じ問題を抱えていました。

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" 

を私もその内容pub mod common;ですが、私はまだ最初のと同じエラーを取得しclientlib.rsを追加(extern crate...を使用して)みました。

私はそれがthis projectのようにモデル化されている可能性がありますが、これはすべてのフォルダにCargo.tomlが必要であることを私は避けたいと考えています。

私は近くにいるように感じますが、何か不足しています。

答えて

1

あなたは現在、木枠としてcommonをビルドしていません。作成されるテンプレートは、ライブラリclientserver(ライブラリのデフォルト名はパッケージ名)とバイナリclientserverです。

通常、extern crate clientserver;が動作します。ただし、ライブラリに別の名前を付ける場合は、別の名前を[lib] section in Cargo.tomlに指定してライブラリを異なる名前にすることができます。このセクションでは、ライブラリのメインソースファイルに異なるソースパスを指定することもできます。あなたのケースではおそらくもっと良いでしょう。さもなければ、あなたはcommonという名前の木箱で終わり、その内容はすべてcommonというモジュールに入っていますので、common::common::fooとしてすべてにアクセスする必要があります。たとえば、あなたのCargo.tomlにこれを追加することによって:

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

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

+0

パーフェクト、これは私の問題を解決しました。あなたの最初の声明は、実際に私が作り出そうとしていたものをクリアするのに多くの助けとなりました。ありがとうございました。同じ方法で複数のライブラリを宣言できますか? '[lib]' 'name =" otherlib "' 'path =" src/otherlib/lib.rs "' – soplu

+0

Cargoはパッケージごとに1つのライブラリしかサポートしていません。 Cargo.tomlのローカルパッケージは[パスの依存関係](http://doc.crates.io/specifying-dependencies.html#specifying-path-dependencies)で参照できます。 –

関連する問題