2014-11-15 3 views
49

Я хотел бы сделать пакет Rust, содержащий как многократно используемую библиотеку (где большая часть программы реализована), так и исполняемый файл, который его использует.Ржавый пакет с библиотекой и двоичным?

Предполагая, что я не путал какую-либо семантику в системе модуля Rust, как должен выглядеть мой файл Cargo.toml?

ответ

65

Tok: TMP Дуг $ дю -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

Спасибо Doug, я попробую! Являются ли #! [Crate_name =] и #! [Crate_type] аннотации необязательными? –

+4

Если вы используете Cargo, эти опции не нужны, потому что Cargo передает их в качестве флагов компилятора. Если вы запустите 'load build -verbose', вы увидите их в командной строке' rustc'. –

+11

Знаете ли вы, почему '[[bin]]' - массив таблиц? Зачем использовать '[[bin]]', а не '[bin]'? По всей видимости, нет никакой документации по этому вопросу. – CMCDragonkai

53

Вы также можете просто поместить двоичные источники в src/bin, а остальную часть ваших источников - в src. Вы можете увидеть пример в my project. Вам совсем не нужно изменять свой Cargo.toml, и каждый исходный файл будет скомпилирован в двоичный файл с тем же именем.

конфигурация Другого ответа является то заменена:

$ 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)); 
} 

И выполните его:

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

Кроме того, вы можете просто создать src/main.rs, который будет использоваться в качестве де-факто исполняемого файла. К сожалению, это противоречит команде cargo doc:

Невозможно документировать пакет, в котором библиотека и двоичные файлы имеют одинаковое имя. Рассмотрим переименования одной или маркировки цели, как doc = false

+7

хорошо вписывается в подход, основанный на использовании ржавчины. оба ответа вместе, и у вас есть отличное удобство и гибкость. –

+0

@Shepmaster Когда я добавляю дополнительные двоичные файлы в 'src/bin', тогда, когда я запускаю их с' run run -bin mybin', в корневой директории проекта создается дополнительная копия исполняемого файла 'mybin'. Любые идеи о том, как остановить это? – Nathan

+0

@ Натан, следуя шагам в этом ответе с Rust 1.15.1, я не могу воспроизвести описанное вами поведение. – Shepmaster

9

Вы можете поставить lib.rs и main.rs источников папку вместе. Нет конфликта, и груз будет строить обе вещи.

Чтобы разрешить конфликт documentaion добавить к вашему Cargo.toml:

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

Это будет охватываться «* Кроме того, вы можете просто создать файл src/main.rs, который будет использоваться как исполняемый файл defacto *». в другом ответе, нет? И конфликт документации разрешен принятым ответом, правильно? Возможно, вам нужно будет уточнить свой ответ, чтобы показать, почему это уникально. Это нормально, чтобы ссылаться на другие ответы, чтобы опираться на них. – Shepmaster

 Смежные вопросы

  • Нет связанных вопросов^_^