Pubblicazione di una cassa contenente entrambi i file lib.rs e main.rs

4

Nella sezione Importazione di casse esterne della Ruggine prenota l'autore crea main.rs file in un progetto di libreria già esistente. Ho prelevato casualmente un mucchio di casse da crates.io , esaminato la loro struttura e non ho trovato alcun progetto contenente entrambi i file lib.rs e main.rs . Quindi mi chiedo se sia comune avere entrambi i file in un progetto library ospitato a crates.io o dovrebbe essere considerato uno stile povero?

Per essere più chiari, sto chiedendo di sviluppare una libreria progettata per condividere con la comunità, non di un eseguibile con un ciclo di vita di pochi giorni. Sono a conoscenza delle funzionalità testing di Cargo, quindi lo scopo di main.rs che voglio aggiungere al la libreria non sta testando. Un buon esempio di come il mio main.rs nella cassa della libreria dovrebbe riguardare la libreria è come lo strumento della riga di comando curl è correlato alla libreria libcurl . A mio avviso, è conveniente disporre di un progetto per il quale cargo build crea un file eseguibile per impostazione predefinita, ma tutte le funzionalità sono disponibili per l'importazione come libreria.

    
posta Sergey 23.07.2015 - 06:49
fonte

1 risposta

4

Il modo più semplice per creare una cassa che contiene un file binario e una libreria (come curl e% esempio dilibcurl) è creare una cartella src/bin nel progetto e posizionare un file che servirà come punto di ingresso al tuo file binario lì (deve contenere un fn main() {} ). Nel tuo esempio questo sarebbe src/bin/curl.rs .

Tutto il tuo codice "libreria" andrebbe in src/lib.rs (e moduli aggiuntivi).

Infine, devi aggiungere una sezione al tuo Cargo.toml che descrive dove trovare il file binario.

[[bin]]
name = "curl"

Quindi il layout del progetto sarebbe simile a questo (assumendo che abbiamo chiamato il progetto curl-rs con cargo ):

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

2 directories, 3 files

Per utilizzare la funzionalità definita nel nostro lib.rs è come se si stesse utilizzando un dep esterno:

// in src/bin/curl.rs
extern crate curl;

fn main() {
    // Do stuff
}

La compilazione di questo progetto inserirà un% binario% co_de linkato staticamente in curl e un target/{debug,release} che verrà utilizzato se qualcuno utilizza semplicemente questo progetto come dep di qualcosa come crates.io.

    
risposta data 25.07.2015 - 17:12
fonte

Leggi altre domande sui tag