Je voudrais faire un projet avec un daemon
et un client
, en me connectant via un socket Unix.
Un client
et un daemon
nécessitent deux binaires, alors comment dire à Cargo
de construire deux cibles à partir de deux sources différentes?
Pour ajouter un peu de fantaisie, je voudrais avoir un library
pour la partie principale du daemon
, et juste avoir un binaire pour l'enrouler et communiquer via des sockets.
Nous avons donc ce type d'architecture arborescente:
├── Cargo.toml
├── target
| └── debug
| ├── daemon
│ └── client
└── src
├── daemon
│ ├── bin
│ │ └── main.rs
│ └── lib
│ └── lib.rs
└── client
└── bin
└── main.rs
Je pourrais créer un exécutable qui gère les deux problèmes, mais ce n'est pas ce que je veux faire, à moins que ce ne soit une très bonne pratique.
Vous pouvez spécifier plusieurs fichiers binaires à l'aide de [[bin]]
, comme mentionné ici :
[[bin]]
name = "daemon"
path = "src/daemon/bin/main.rs"
[[bin]]
name = "client"
path = "src/client/bin/main.rs"
Conseil: Si vous placez plutôt ces fichiers dans src/bin/daemon.rs
et src/bin/client.rs
, vous obtiendrez deux exécutables nommés daemon
et client
car Cargo compile tous les fichiers dans src/bin
en exécutables du même nom automatiquement. Vous devez spécifier des noms et des chemins comme dans l'extrait ci-dessus uniquement si vous ne suivez pas cette convention.
Une autre façon est d'utiliser la fonctionnalité d'espace de travail comme mentionné ici . Cela fournira plus de flexibilité car nous pouvons avoir plus d'une bibliothèque. Exemple de structure de projet:
.
├── 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
Contenu de la racine Cargo.toml
:
[workspace]
members = ["cli", "core", "daemon", "gui", "rpc"]