Пакет ржавчины с библиотекой и двоичным?

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

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

 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 "] [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(); } 

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

Конфигурация другого ответа затем заменяется на:

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

Cargo.toml

 [package] name = "example" version = "0.0.1" authors = ["An Devloper "] 

SRC / lib.rs

 use std::error::Error; pub fn really_complicated_code(a: u8, b: u8) -> Result> { Ok(a + b) } 

ЦСИ / 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 который будет использоваться как исполняемый файл defacto. К сожалению, это противоречит команде cargo doc :

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

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

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

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

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

Мы создаем двоичный проект, который включает в себя библиотеку внутри нее:

 the-binary ├── Cargo.lock ├── Cargo.toml ├── mylibrary │  ├── Cargo.toml │  └── src │  └── lib.rs └── src └── main.rs 

Cargo.toml

Это использует ключ [workspace] и зависит от библиотеки:

 [package] name = "the-binary" version = "0.1.0" authors = ["An Devloper "] [workspace] [dependencies] mylibrary = { path = "mylibrary" } 

SRC / main.rs

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

MyLibrary / SRC / lib.rs

 use std::error::Error; pub fn really_complicated_code(a: u8, b: u8) -> Result> { Ok(a + b) } 

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

 $ cargo run Compiling mylibrary v0.1.0 (file:///private/tmp/the-binary/mylibrary) Compiling the-binary v0.1.0 (file:///private/tmp/the-binary) Finished dev [unoptimized + debuginfo] target(s) in 0.73 secs Running `target/debug/the-binary` I'm using the library: Ok(3) 

Для этой схемы есть два больших преимущества:

  1. Теперь двоичный код может использовать зависимости, которые применяются только к нему. Например, вы можете включить множество ящиков, чтобы улучшить работу пользователя, например, синтаксические анализаторы командной строки или форматирование терминала. Ни один из них не «заразит» библиотеку.

  2. Рабочее пространство предотвращает избыточные сборки каждого компонента. Если мы запустим cargo build как в mylibrary и the-binary каталоге, библиотека не будет создаваться одновременно – она ​​разделяется между обоими проектами.

  • Передача изменчивой самостоятельной ссылки на метод принадлежащего ему объекта
  • «Задолженность недолговечна», похоже, виноват в неправильной
  • Как мне взять RefCell , найти ключ и вернуть ссылку на результат?
  • Есть ли способ объединить несколько признаков, чтобы определить новый признак?
  • Не удается выйти из заемного контента при развертывании
  • Мутируемое «я» при чтении с объекта владельца
  • Разрешены ли полиморфные переменные?
  • Автоматически реализовать черты замкнутого типа для новых типов Rust (кортежи с одним полем)
  • Как преобразовать String в & 'static str
  • Когда мне следует реализовать std :: convert :: From vs std :: convert :: Into?
  • Возrotation замыкания из функции
  • Interesting Posts

    Как отформатировать / восстановить USB-накопитель с защитой от записи с ошибками ввода-вывода?

    Фон с 2 цветами в JavaFX?

    Выберите синтаксический анализ int, если строка была подвержена анализу int

    Примеры интенсивного расчета процессора?

    Java: бесконечный цикл с использованием Scanner in.hasNextInt ()

    Панель не получает фокус

    Включение ProGuard в Eclipse для Android

    Почему я не должен называть setVisible (true) перед добавлением компонентов?

    Где Google Chrome сохраняет LocalStorage от расширений?

    Какая синяя двойная стрелка появляется над ссылками?

    Износ диска USB, когда он установлен только для чтения

    Как доверенный корневой сертификат появляется в списке доверенных корней?

    Как настроить перенаправление IP-адресов на маршрутизаторе NetGear N600 WNDR3400?

    Как я могу выполнить большое количество различных find / replaces?

    Signalr / Hub не загружается в IIS 7, но корректно работает в Visual Studio

    Давайте будем гением компьютера.