Wie kann ich mit Cargo mehrere Binärdateien erstellen?

95

Ich möchte ein Projekt mit a daemonund clienta erstellen und eine Verbindung über einen Unix-Socket herstellen.

A clientund a daemonerfordern zwei Binärdateien. Wie kann ich also Cargozwei Ziele aus zwei verschiedenen Quellen erstellen?

Um ein bisschen Fantasie hinzuzufügen, hätte ich gerne eine libraryfür den Hauptteil der daemonund nur eine Binärdatei, um sie zu umwickeln und über Sockets zu kommunizieren.

Wir haben also diese Art von Baumarchitektur:

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

Ich könnte eine ausführbare Datei erstellen, die beide Probleme verwaltet, aber das möchte ich nicht tun, es sei denn, es ist eine sehr gute Praxis.

RallionRl
quelle
In Ergänzung zu Dognerts Antwort beantworten sie alle Fragen, die ich bekommen habe. Vielen Dank!
RallionRl

Antworten:

126

Sie können mehrere Binärdateien angeben verwenden [[bin]], wie erwähnt hier :

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

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

Tipp: Wenn Sie stattdessen diese Dateien in src/bin/daemon.rsund src/bin/client.rsablegen, erhalten Sie zwei ausführbare Dateien mit dem Namen daemonund clientwährend Cargo alle Dateien src/binautomatisch in ausführbare Dateien mit demselben Namen kompiliert . Sie müssen Namen und Pfade wie im obigen Snippet nur angeben, wenn Sie diese Konvention nicht befolgen.

Dogbert
quelle
Ich habe mir die Dokumentation Cargo angesehen, kann aber nichts sehen. Können Sie die Ausgabe angeben, um die Binärdatei zu speichern? Zum Beispiel pathTo: "/ some / path" Mein Englisch tut mir leid.
Angel Angel
Wenn Sie der Meinung sind, dass es besser ist, eine Frage dazu zu erstellen, kann ich dies problemlos tun. Ist es möglicherweise einfacher, andere mit derselben Frage zu finden?
Angel Angel
@AngelAngel Sie möchten den Ausgabepfad anpassen? Standardmäßig wird es in gespeichert werden , target/debug/$namewo $namedie nameSie in Cargo.toml angeben.
Dogbert
Ich habe mich nur gefragt, ob Sie sagen können, wo Sie eine Kopie der Binärdatei an einer anderen Stelle als der Standardinstallation installieren sollen. Eine Kopie in $ name und eine weitere Kopie in einem anderen Pfad. Nicht, dass es trivial wäre, nur neugierig, danke für deine Zeit.
Angel Angel
@AngelAngel Ich denke, Sie suchen nach dem cargo installBefehl. Versuchen Sie, die Ausgabe von zu lesen cargo help install.
Dogbert
14

Eine andere Möglichkeit ist die Verwendung der Arbeitsbereichsfunktion . Dies bietet mehr Flexibilität, da wir mehr als eine Bibliothek haben können. Beispiel Projektstruktur:

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

Inhalt der Wurzel Cargo.toml:

[workspace]
members = ["cli", "core", "daemon", "gui", "rpc"]
UltimaWeapon
quelle
1
Ich konnte das nicht zum Laufen bringen. Ich musste die binäre Rostquelle in den Ordner src / verschieben und ein anderes Ziel in angeben [[bin]]. Können Sie uns näher erläutern, was Sie getan haben, damit dies funktioniert? Ich habe den folgenden Fehler erhalten: use ::engine::RuleEngine; could not find engine in {{root}}
Kenny Bambridge
@KennyBambridge Ich habe eine Weile nicht an Rust gearbeitet. IIRC Als ich diese Antwort erstellt habe, habe ich es auf meinem lokalen Computer versucht und es funktioniert wie beabsichtigt.
UltimaWeapon
@KennyBambridge Sie müssen Kisten in anderen Arbeitsbereichen als Abhängigkeiten in der Cargo.toml hinzufügen, in der Sie sie verwenden möchten.
Caesar
1

Ein anderes Format könnte darin bestehen, das zu replizieren, was der Quellcode von Crates.io getan hat, wenn Sie ein umfangreiches Projekt haben, etwa:

Hauptbibliothek in src mit einem Bin-Ordner mit Ihren ausführbaren Dateien. Rufen Sie dann von Ihren ausführbaren Dateien aus Ihre Hauptbibliothekskiste auf.

Auf diese Weise ist Ihre Bibliothek zentralisiert, sodass Sie Dinge leichter finden können, wenn sie zwischengespeichert werden.

Robust Systems 8472-1488
quelle