138 votes

Comment puis-je construire plusieurs binaires avec Cargo ?

J'aimerais faire un projet avec une daemon et un client en se connectant via un socket unix.

A client et un daemon nécessite deux binaires, alors comment puis-je dire à Cargo pour construire deux cibles à partir de deux sources différentes ?

Pour ajouter un peu de fantaisie, j'aimerais avoir un library pour la partie principale de la daemon et il suffit d'avoir un binaire pour l'envelopper et communiquer via des sockets.

Nous avons donc cette sorte 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.

2 votes

0 votes

En complément de Dognert réponse, ils répondent à toutes les questions que j'ai eues. Merci beaucoup !

180voto

Dogbert Points 44003

Vous pouvez spécifier plusieurs binaires en utilisant [[bin]] comme indiqué aquí :

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

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

Conseil : Si vous placez ces fichiers dans src/bin/daemon.rs y src/bin/client.rs vous obtiendrez deux exécutables nommés daemon y client car Cargo compile tous les fichiers dans src/bin en exécutables portant le même nom automatiquement. Vous devez spécifier les noms et les chemins comme dans l'extrait ci-dessus uniquement si vous ne suivez pas cette convention.

0 votes

J'ai regardé la documentation de Cargo, mais je ne vois rien, vous pouvez spécifier la sortie pour stocker le binaire ? par exemple pathTo : "/quelquechose/chemin" Je suis désolé pour mon anglais.

0 votes

Si vous pensez qu'il est préférable de créer une question à ce sujet, je peux le faire sans problème, cela pourrait être plus facile de trouver d'autres personnes ayant la même question ?

0 votes

@AngelAngel vous voulez personnaliser le chemin de sortie ? Par défaut, il sera stocké dans target/debug/$name donde $name est le name que vous spécifiez dans Cargo.toml.

34voto

UltimaWeapon Points 1723

Une autre façon est d'utiliser la fonction d'espace de travail . Cela offrira une plus grande flexibilité du fait que 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"]

2voto

Un autre format pourrait être de reproduire ce que les Code source de Crates.io a fait, si vous avez un projet massif, quelque chose comme :

Bibliothèque principale dans src, avec un dossier Bin contenant vos exécutables. Ensuite, faites des appels à votre bibliothèque principale à partir de vos exécutables.

De cette façon, votre bibliothèque est centralisée et il est plus facile de trouver des choses puisqu'elle est mise en cache.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X