¿Cómo puedo crear varios binarios con Cargo?

94

Me gustaría hacer un proyecto con a daemony a client, conectando a través de un socket unix.

A clienty a daemonrequieren dos binarios, entonces, ¿cómo puedo saber si hay Cargoque construir dos objetivos a partir de dos fuentes diferentes?

Para agregar un poco de fantasía, me gustaría tener un librarypara la parte principal del daemon, y solo tener un binario para envolverlo y comunicarlo a través de sockets.

Entonces, tenemos este tipo de arquitectura de árbol:

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

Podría hacer un ejecutable que maneje ambas preocupaciones, pero eso no es lo que quiero hacer, a menos que sea una muy buena práctica.

RallionRl
fuente
1
Muy relevante: ¿ paquete Rust con una biblioteca y un binario? .
Shepmaster
Como complemento de la respuesta de Dognert , responden todas las preguntas que recibí. ¡Muchas gracias!
RallionRl

Respuestas:

125

Puede especificar varios binarios usando [[bin]], como se menciona aquí :

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

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

Consejo: si en cambio coloca estos archivos en src/bin/daemon.rsy src/bin/client.rs, obtendrá dos ejecutables con el nombre daemony clientmientras Cargo compila todos los archivos en src/binejecutables con el mismo nombre automáticamente. Debe especificar nombres y rutas como en el fragmento anterior solo si no sigue esta convención.

Dogbert
fuente
He mirado la documentación Cargo, pero no veo nada, ¿puedes especificar la salida para almacenar el binario? por ejemplo pathTo: "/ some / path" Lo siento por mi inglés.
Angel Angel
si crees que es mejor crear una pregunta sobre esto, puedo hacerlo sin ningún problema, ¿podría ser más fácil encontrar otros con la misma pregunta?
Angel Angel
@AngelAngel, ¿quieres personalizar la ruta de salida? Por defecto que va a ser almacenada en target/debug/$namedonde $namees la nameque se especifica en Cargo.toml.
Dogbert
Me preguntaba si podría decir dónde instalar una copia del binario en otro lugar que no sea el predeterminado. Una copia en $ name y otra copia en otra ruta. No es que sea trivial, solo curiosidad, gracias por tu tiempo.
Angel Angel
@AngelAngel Creo que estás buscando el cargo installcomando. Intente leer el resultado de cargo help install.
Dogbert
14

Otra forma es utilizar la función de espacio de trabajo . Esto proporcionará más flexibilidad debido al hecho de que podemos tener más de una biblioteca. Estructura de proyecto de ejemplo:

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

Contenido de la raíz Cargo.toml:

[workspace]
members = ["cli", "core", "daemon", "gui", "rpc"]
UltimaWeapon
fuente
1
No pude hacer que esto funcionara. Tuve que mover la fuente binaria de óxido en la carpeta src / y especificar otro destino en [[bin]]. ¿Podría dar más detalles sobre lo que hizo para que esto funcione? Recibía el siguiente error: use ::engine::RuleEngine; could not find engine in {{root}}
Kenny Bambridge
@KennyBambridge No he trabajado en Rust por un tiempo. IIRC cuando creé esta respuesta, probé en mi máquina local y funciona según lo previsto.
UltimaWeapon
@KennyBambridge Tiene que agregar cajas en otros espacios de trabajo como dependencias en Cargo.toml donde desee usarlas.
César
1

Otro formato podría ser replicar lo que ha hecho el código fuente de Crates.io , si tiene un proyecto masivo, algo como:

Biblioteca principal en src, con una carpeta Bin con sus ejecutables. Luego haga llamadas a la caja de su biblioteca principal desde sus ejecutables.

De esa manera, su biblioteca está centralizada para que sea más fácil encontrar cosas mientras está almacenada en caché.

Sistemas robustos 8472-1488
fuente