web-dev-qa-db-fra.com

Comment créer plusieurs binaires avec Cargo?

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.

47
RallionRl

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.

68
Dogbert

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"]
1
UltimaWeapon