¿Cómo puedo crear varios binarios con Cargo?
Me gustaría hacer un proyecto con a daemon
y a client
, conectándolo a través de un socket Unix.
A client
y a daemon
requieren dos archivos binarios, entonces, ¿cómo puedo saber si debo Cargo
crear dos objetivos a partir de dos fuentes diferentes?
Para agregar un poco de fantasía, me gustaría tener un archivo library
para la parte principal daemon
y 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.
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 run
comando con la --bin <bin-name>
opción.
Consejo: Si en lugar de eso colocas estos archivos en src/bin/daemon.rs
y src/bin/client.rs
, obtendrás dos ejecutables nombrados daemon
y client
Cargo compilará todos los archivos en src/bin
ejecutables con el mismo nombre automáticamente. Debe especificar nombres y rutas como en el fragmento anterior solo si no sigue esta convención.
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"]
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é.