Cargoで複数のバイナリを構築するにはどうすればよいですか?


103

UNIXソケットを介して接続するadaemonとaを使用してプロジェクトを作成したいと思いclientます。

Aclientとaにdaemonは2つのバイナリが必要Cargoですが、2つの異なるソースから2つのターゲットを構築するように指示するにはどうすればよいですか?

ちょっとしたファンタジーを追加するlibraryために、の主要部分にを用意し、daemonそれをラップしてソケットを介して通信するためのバイナリを用意したいと思います。

したがって、この種のツリーアーキテクチャがあります。

├── Cargo.toml
├── target
|   └── debug
|       ├── daemon
│       └── client
└── src
    ├── daemon
    │   ├── bin
    │   │   └── main.rs
    │   └── lib
    │       └── lib.rs
    └── client
        └── bin
            └── main.rs

両方の懸念を管理する1つの実行可能ファイルを作成することもできますが、それが非常に良い方法でない限り、それは私がやりたいことではありません。



Dognertの答えを補完するものとして、彼らは私が得たすべての質問に答えます。大いに感謝する!
RallionRl 2016

回答:


137

ここ[[bin]]で説明するように、を使用して複数のバイナリを指定できます。

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

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

ヒント:代わりにこれらのファイルをsrc/bin/daemon.rssrc/bin/client.rsに配置すると、2つの実行可能ファイルという名前が付けられdaemonclientCargoがすべてのファイルをsrc/bin同じ名前の実行可能ファイルに自動的にコンパイルします。この規則に従わない場合にのみ、上記のスニペットのように名前とパスを指定する必要があります。


ドキュメントCargoを見ましたが、何も表示されません。バイナリを格納するための出力を指定できますか?例:pathTo: "/ some / path"英語でごめんなさい。
エンジェルエンジェル

これについて質問を作成する方が良いと思う場合は、問題なく作成できます。同じ質問を持つ他の人を見つける方が簡単かもしれません。
エンジェルエンジェル

@AngelAngel出力パスをカスタマイズしますか?デフォルトでは、に格納されますtarget/debug/$name場所$nameであるnameあなたがCargo.tomlで指定します。
Dogbert 2016

デフォルト以外の場所にバイナリのコピーをインストールする場所を教えてもらえないかと思いました。$ nameのコピーと、別のパスの別のコピー。些細なことではなく、好奇心旺盛です。お時間をいただきありがとうございます。
エンジェルエンジェル

@AngelAngelあなたはcargo installコマンドを探していると思います。の出力を読んでみてくださいcargo help install
Dogbert 2016

18

別の方法は、ワークスペース機能を使用することです。これにより、複数のライブラリを使用できるため、柔軟性が向上します。プロジェクト構造の例:

.
├── Cargo.toml
├── cli
│   ├── Cargo.toml
│   └── src
│       └── main.rs
├── core
│   ├── Cargo.toml
│   └── src
│       └── lib.rs
├── daemon
│   ├── Cargo.toml
│   └── src
│       └── main.rs
├── gui
│   ├── Cargo.toml
│   └── src
│       └── main.rs
└── rpc
    ├── Cargo.toml
    └── src
        └── lib.rs

ルートの内容Cargo.toml

[workspace]
members = ["cli", "core", "daemon", "gui", "rpc"]

1
これを機能させることができませんでした。バイナリラストソースをsrc /フォルダーに移動し、で別のターゲットを指定する必要がありました[[bin]]。これを機能させるために何をしたかについて詳しく教えてください。私は次のエラーを得ていた: use ::engine::RuleEngine; could not find engine in {{root}}
ケニーBambridgeを

@KennyBambridge私はしばらくRustに取り組んでいません。この回答を作成したときのIIRCは、ローカルマシンで試しましたが、意図したとおりに機能します。
UltimaWeapon

@KennyBambridge他のワークスペースのクレートを、それらを使用するCargo.tomlの依存関係として追加する必要があります。
シーザー

1

別の形式は、次のような大規模なプロジェクトがある場合、Crates.ioソースコードが実行したことを複製することです。

実行可能ファイルを含むBinフォルダーを含むsrcのメインライブラリ。次に、実行可能ファイルからメインライブラリクレートを呼び出します。

そうすれば、ライブラリが一元化されるため、キャッシュされているものを簡単に見つけることができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.