Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Тема
Описание
Доп.

crate cargo-release дополняет возможности crate cargo_publish общепринятыми методами выпуска, такими как валидация, управление версиями, тегирование и отправка. Процесс можно настраивать, но с настройками по умолчанию, которые помогут вам быстро приступить к работе.

crate release-plz

Как принято распространять cli утилиты написанные на Rust чтобы можно было поделиться с другими участниками сообщества?

Первый шаг — публикация на crates.io, так что cargo install my-cli-app уже будет работать (посмотри ripgrep, dust, exa, cargo-deny для примеров), а дальше уже можно настраивать CI для создания бинарных релизов в GitHub Releases, а дальше можно пакеты собирать под разные пакетные менеджеры... в общем, есть чем заняться

StructOpt (и его версия внутри clap 3.0) — это лучшее решение, которое мне известно и я им полностью доволен (я в DOTS его использую)

Пример создания и подключение библиотеки

reference/cargo-targets.html#configuring-a-target

cargo/reference/config

По умолчанию используется имя файла src/lib.rs, а имя библиотеки по умолчанию - имя пакета.

Создание

$ cargo new hello_world --lib --vcs none

File Cargo.toml:

[package]
name = "hello_world"
version = "0.1.0"
authors = ["jeka <yaroshjeka@gmail.com>"]
edition = "2018"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
[lib]
name = "hello_world"
path = "src/lib.rs"
crate-type = ["lib"]

File src/lib.rs:


pub fn sum(a:i32,b:i32,mess:&str)->i32{
    let result = a+b;
    println!("{}: {}+{}={}",mess,a,b,result);
    result
}

#[cfg(test)]
mod tests {
    #[test]
    fn it_works() {
            assert_eq!(2 + 2, 4);
    }
}
// Для использования самой библиотеки в качестве программы
// создать файл main.rs
fn main() {
    hello_world::sum(1,4,"Hello, world!");
}

Сборка

Сборка для данной архитектуры. По умолчанию используется хост-архитектура.

$ cargo build --lib
для crate-type = ["lib"]
 \hello_world\target\debug\hello_world.d  
 \hello_world\target\debug\hello_world.rlib
для crate-type = ["dylib"]
  \hello_world\target\debug\hello_world.d 
  \hello_world\target\debug\hello_world.dll 
  \hello_world\target\debug\hello_world.exp 
  \hello_world\target\debug\hello_world.lib
  \hello_world\target\debug\hello_world.pdb 

Подключение

В другом проекте

Файл Cargo.toml:

[dependencies]
hello_world = { path = "../test_lib/hello_world" } # путь к папке библиотеки

Файл main.rs:


extern crate hello_world;
use hello_world::sum;
fn main() {
     sum(1,2,"Hello, world!");
}

Публикация на crates.io

Как публиковать свои пакеты на crates.io

👾 Найти идею которая еще не реализованна в репозитории библиотек и реализовать ее!

1. Создание нового проекта

В Rust есть два типа проектов: бинарный (bin) и библиотечный (lib). Для библиотеки:

cargo new my_library --lib

Структура будет примерно такой:

my_library/
├── Cargo.toml
└── src/
    └── lib.rs

2. Файл Cargo.toml

В нём указывается имя, версия и зависимости:

[package]
name = "my_library"
version = "0.1.0"
edition = "2021"

[dependencies]

3. Точка входа для библиотеки — src/lib.rs

Здесь ты определяешь публичный API:

pub fn add(a: i32, b: i32) -> i32 {
    a + b
}

pub mod utils {
    pub fn hello(name: &str) -> String {
        format!("Hello, {name}!")
    }
}
fn main(){}

Всё, что надо сделать доступным пользователям, нужно объявить через pub.


4. Тесты

Rust поддерживает встроенные тесты:

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_add() {
        assert_eq!(add(2, 3), 5);
    }

    #[test]
    fn test_hello() {
        assert_eq!(utils::hello("Rust"), "Hello, Rust!");
    }
}

Запускаются так:

cargo test

5. Документация

Комментарии с /// становятся документацией:

/// Складывает два числа
///
/// # Пример
/// &#96;&#96;&#96;rust
/// use my_library::add;
/// assert_eq!(add(2, 3), 5);
/// &#96;&#96;&#96;
pub fn add(a: i32, b: i32) -> i32 {
    a + b
}

Документацию можно сгенерировать:

cargo doc --open

6. Публикация

Чтобы поделиться библиотекой:

  1. Регистрация на crates.io.
  2. В Cargo.toml добавить описание, лицензию, репозиторий и т. д.
  3. Войти в аккаунт через cargo:
$ cargo login <твой-токен>
  1. Публикация:
cargo publish

В итоге библиотека будет доступна другим через:

[dependencies]
my_library = "0.1"