Me gustaría hacer un paquete Rust que contenga tanto una biblioteca reutilizable (donde se implementa la mayor parte del programa), como también un ejecutable que lo use.
Suponiendo que no he confundido ninguna semántica en el sistema del módulo Rust, ¿cómo debería ser mi Cargo.toml
archivo?
rust
rust-cargo
Andrew Wagner
fuente
fuente
cargo build --verbose
, los verás en larustc
línea de comandos.[[bin]]
hay una gran variedad de tablas? ¿Por qué usar[[bin]]
y no[bin]
? No parece haber ninguna documentación al respecto.También puede simplemente colocar fuentes binarias
src/bin
y el resto de sus fuentessrc
. Puedes ver un ejemplo en mi proyecto . No es necesario modificarloCargo.toml
en absoluto, y cada archivo fuente se compilará en un binario del mismo nombre.La configuración de la otra respuesta se reemplaza por:
Cargo.toml
src / lib.rs
src / bin / mybin.rs
Y ejecutarlo:
Además, puede crear uno
src/main.rs
que se utilizará como ejecutable de facto. Desafortunadamente, esto entra en conflicto con elcargo doc
comando:fuente
extern crate example;
no se requiere a partir de rust 2018, puede escribir directamenteuse example::really_complicated_code;
y usar la función sin nombrar el alcanceUna solución alternativa es no tratar de agrupar ambas cosas en un solo paquete. Para proyectos un poco más grandes con un ejecutable amigable, me pareció muy agradable usar un espacio de trabajo
Creamos un proyecto binario que incluye una biblioteca dentro de él:
Cargo.toml
Esto usa la
[workspace]
clave y depende de la biblioteca:src / main.rs
mylibrary / src / lib.rs
Y ejecutarlo:
Hay dos grandes beneficios para este esquema:
El binario ahora puede usar dependencias que solo se aplican a él. Por ejemplo, puede incluir muchas cajas para mejorar la experiencia del usuario, como analizadores de línea de comandos o formato de terminal. Ninguno de estos "infectará" la biblioteca.
El espacio de trabajo evita compilaciones redundantes de cada componente. Si corremos
cargo build
tanto en elmylibrary
y elthe-binary
directorio, la biblioteca no se construirá en ambas ocasiones - es compartida entre ambos proyectos.fuente
main.rs
, luego lo divido en módulos a medida que crece, finalmente me separosrc/bin
cuando es un poco más grande, y luego me muevo a un espacio de trabajo cuando empiezo a reutilizar en gran medida la lógica central.cargo test
parece ignorar las pruebas unitarias en lib.rscargo test --all
Puede poner
lib.rs
ymain.rs
en la carpeta de fuentes juntas. No hay conflicto y la carga construirá ambas cosas.Para resolver conflictos de documentación, agregue a su
Cargo.toml
:fuente