2014-11-15 10 views
49

Vorrei creare un pacchetto Rust che contenga sia una libreria riutilizzabile (in cui è implementata la maggior parte del programma), sia un eseguibile che la utilizza.Pacchetto ruggine con una libreria e un binario?

Supponendo che non abbia confuso alcuna semantica nel sistema del modulo Rust, come dovrebbe essere il mio file Cargo.toml?

risposta

65

Tok: tmp Doug $ du -a

8 ./Cargo.toml 
8 ./src/bin.rs 
8 ./src/lib.rs 
16 ./src 

Cargo.toml:

[package] 
name = "mything" 
version = "0.0.1" 
authors = ["me <[email protected]>"] 

[lib] 
name = "mylib" 
path = "src/lib.rs" 

[[bin]] 
name = "mybin" 
path = "src/bin.rs" 

src/lib.rs:

pub fn test() { 
    println!("Test"); 
} 

src/bin.rs:

extern crate mylib; 

use mylib::test; 

pub fn main() { 
    test(); 
} 
+1

Grazie Doug, io provare! Le annotazioni #! [Crate_name =] e #! [Crate_type] sono opzionali? –

+4

Quando si utilizza Carico, queste opzioni non sono necessarie perché Cargo le passa come flag del compilatore. Se esegui 'cargo build --verbose', li vedrai nella riga di comando' rustc'. –

+11

Sai perché '[[bin]]' è un array di tabelle? Perché usare '[[bin]]' e non '[bin]'? Non sembra esserci alcuna documentazione su questo. – CMCDragonkai

53

Puoi anche inserire sorgenti binarie in src/bin e il resto delle tue fonti in src. È possibile visualizzare un esempio in my project. Non è necessario modificare lo Cargo.toml e ogni file sorgente verrà compilato su un binario con lo stesso nome.

configurazione di L'altra risposta è quindi sostituito dal seguente:

$ tree 
. 
├── Cargo.toml 
└── src 
   ├── bin 
   │   └── mybin.rs 
   └── lib.rs 

$ cat Cargo.toml 
[package] 
name = "example" 
version = "0.0.1" 
authors = ["An Devloper <[email protected]>"] 

src/lib.rs

use std::error::Error; 

pub fn really_complicated_code(a: u8, b: u8) -> Result<u8, Box<Error>> { 
    Ok(a + b) 
} 

src/bin/mybin.rs

extern crate example; 

fn main() { 
    println!("I'm using the library: {:?}", example::really_complicated_code(1, 2)); 
} 

Ed eseguilo:

$ cargo run --bin mybin 
I'm using the library: Ok(3) 

Inoltre, si può semplicemente creare un src/main.rs che verrà utilizzato come l'eseguibile di fatto. Purtroppo, questo è in conflitto con il comando cargo doc:

non in grado di documentare un pacchetto in cui una biblioteca e un binario hanno lo stesso nome. Considerare rinominare uno o segnando la destinazione come doc = false

+7

si adatta bene all'approccio convenzionale di over-configuration della ruggine! entrambe le risposte insieme e tu hai una grande comodità e flessibilità. –

+0

@Shepmaster Quando aggiungo binari extra in 'src/bin', quando li eseguo con' cargo run --bin mybin' viene generata una copia extra dell'eseguibile 'mybin' nella directory del progetto root. Qualche idea su come fermare questo? – Nathan

+0

@Nathan seguendo i passaggi di questa risposta con Rust 1.15.1, non sono in grado di riprodurre il comportamento che descrivi. – Shepmaster

9

Si può mettere lib.rs e main.rs a fonti cartella insieme. Non c'è conflitto e il carico costruirà entrambe le cose.

Per risolvere il conflitto documentaion aggiungere al vostro Cargo.toml:

[[bin]] 
name = "main" 
doc = false 
+1

Che verrebbe coperto da "* Inoltre, puoi semplicemente creare un src/main.rs che verrà usato come eseguibile defacto *". nell'altra risposta, no? E il conflitto di documentazione è risolto dalla risposta accettata, giusto? Potrebbe essere necessario chiarire la risposta per mostrare perché questo è unico. Va bene fare riferimento alle altre risposte per costruirle. – Shepmaster

Problemi correlati