web-dev-qa-db-ja.com

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

Unixソケットを介して接続するdaemonclientを含むプロジェクトを作成したいと思います。

clientdaemonには2つのバイナリが必要です。2つの異なるソースから2つのターゲットをビルドするようにCargoに指示するにはどうすればよいですか?

少し幻想を加えるために、libraryの主要部分にdaemonを持ち、それをラップしてソケットを介して通信するためのバイナリを持ちたいです。

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

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

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

47
RallionRl

前述のように、[[bin]]を使用して複数のバイナリを指定できます here

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

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

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

68
Dogbert

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

.
├── 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
UltimaWeapon