¿Cómo puedo crear varios binarios con Cargo?

Resuelto RallionRl asked hace 8 años • 3 respuestas

Me gustaría hacer un proyecto con a daemony a client, conectándolo a través de un socket Unix.

A clienty a daemonrequieren dos archivos binarios, entonces, ¿cómo puedo saber si debo Cargocrear dos objetivos a partir de dos fuentes diferentes?

Para agregar un poco de fantasía, me gustaría tener un archivo librarypara la parte principal daemony simplemente 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 crear un ejecutable que gestione ambas inquietudes, pero eso no es lo que quiero hacer, a menos que sea una muy buena práctica.

RallionRl avatar Apr 13 '16 23:04 RallionRl
Aceptado

Puede especificar varios binarios usando [[bin]], como se menciona en el Libro de carga

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

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

Puede ejecutar binarios individuales con el cargo runcomando con la --bin <bin-name>opción.

Consejo: Si en lugar de eso colocas estos archivos en src/bin/daemon.rsy src/bin/client.rs, obtendrás dos ejecutables nombrados daemony clientCargo compilará 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 avatar Apr 13 '2016 16:04 Dogbert

Otra forma es utilizar la función de espacio de trabajo . Esto proporcionará más flexibilidad debido a que podemos tener más de una biblioteca. Ejemplo de estructura de proyecto:

.
├── 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 avatar Aug 23 '2019 17:08 UltimaWeapon

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

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

De esa manera, su biblioteca está centralizada, por lo que es más fácil encontrar cosas ya que está almacenada en caché.

Robust Systems 8472-1488 avatar Sep 08 '2019 00:09 Robust Systems 8472-1488