External links:
rustup component add rustfmt
rustup component add rust-src
git clone https://github.com/AstroNvim/AstroNvim ~/.config/nvim
nvim +PackerSync
# After install use commands:
:LspInstall rust -> rust-analyzer
:TSInstall rust
- Neovide GUI upgrade on Astro Vim
git clone https://github.com/neovide/neovide
cd neovide
cargo build --release
cargo install evcxr_repl
cargo install irust
VSCode Extensions for Rust
- CodeLLDB
- Dependi (бывш crates) - сообщает, если пакеты устарели
VSCode Settings
(For CodeLLDB) Allow breakpoints everywhere: "debug.allowBreakpointsEverywhere": true
cargo check: поменять check на clippy: "rust-analyzer.check.command": "clippy"
Rust Prelude
Rust has a Prelude - a set of libraries included in every project.
See current libs included in Prelude
std::io::stdin library is used to get user input from standard input stream. Not included in Prelude:
use std:io
let mut guess = String::new();
io::stdin().read_line(&mut guess).expect("Failed to load");
.expect handles Err variant of read_line function, crashing the program with the defined error message.
Subsections of Build Tools
Bacon
Links:
Bacon
Bacon - CLI-утилита запуска команд сборки или тестов по триггеру.
Установка
cargo install --locked bacon
bacon test # run from project folder
Настройка
Запуск команды инициализации:
Приводит к появлению в папке проекта файла bacon.toml с разными вариантами команд, и можно дописать свою секцию, например:
[jobs.check-examples]
command = ["cargo", "run", "--example", "iterators"]
watch = ["examples"]
need_stdout = true
command - команда и параметры
watch - отслеживаемая папка
need_stdout - stdout вывод кода показывать к терминале
Далее запуск секции:
Интерактивный перезапуск компиляции
This will compile+build the code in examples folder, file “variables.rs”. Very convenient to try test different stuff. For live development do:
bacon run -- -q # сборка и запуск текущего проект
bacon run -- -q --example <файл> # сборка и запуск файла в папке examples
bacon test # запуск unit-тестов (например, определённых для lib.rs)
-q - убрать вывод деталей компиляции
(deprecated) Cargo Watch - интерактивный перезапуск компиляции
This will compile+build the code in examples folder, file “variables.rs”. Very convenient to try test different stuff. For live development do:
cargo watch -q -c -x 'run -q --example variables'
-x - rerun upon code change
-c - clear terminal each time
-q - quiet mode
❗Проект cargo watch заморожен, более не развивается.
Cargo
Use Cargo for managing projects.
cargo new test_project // create project with binary file src/main.rs
// OR
cargo new test_project --lib // create project with library file src/lib.rs
cd test_project
Source code is in src folder.
cargo build # build project for debug, do not run
cargo run # build & run project
cargo check # fast compiling
cargo build --release # slow build with optimizations for speed of release version
Documentation of methods & traits used in code can be compiled an opened in browser with Cargo command:
Cargo Examples
Create “examples” folder beside the “src” folder. Create a file named, for example, “variables.rs” and place some test code in the folder. Then in the project root folder run:
cargo run --example variables
Panic Response
В ответ на панику, по умолчанию программа разматывает стек (unwinding) - проходит по стеку и вычищает данные всех функций. Для уменьшения размера можно просто отключать программу без очистки - abort. Для этого в файле Cargo.toml надо добавить в разделы [profile]:
[profile.release]
panic = 'abort'
Important Cargo libs
Секция подробностей работы разных библиотек постепенно пополняется.
- Tokio - async runtime
- Eyre & color-eyre - type signatures, error report handling
- Tracing - collect diagnostic info
- Reqwest - HTTP requests library, async
- Rayon - data parallelism library, without data races
- Clap - commandline passing library
- SQLX - compile-checked SQL, async
- Chrono - time/date library
- EGUI - web-gui @60FPS, runs in Webassembly
- Yew.rs - web-library like React.js
Cargo Workspaces
Cargo Workspaces
Объединение кода в 1 проект. В Cargo.toml нужно объявить его структуру:
[package]
name = "ardan_workspace"
version = "0.1.0"
edition = "2021"
[dependencies]
[workspace]
members = [
"session1/hello_world",
"session1/variables",
]
После этого можно добавлять подпрограммы в members, через cargo new <подрограмма>.
Создание и подключение библиотеки в Workspace
Создание библиотеки вместо бинарника - `cargo new –lib examplelib
Прописать в файле cargo.toml у бинарной программы в workspace зависимость:
<..>
[dependencies]
examplelib = { path = "../examplelib"}
Далее, в код бинарной программы включить функции из библиотеки:
use examplelib::function01; // фукнкция должна быть публичной (pub fn)
Единая инициализация и сборка библиотек зависимостей в Workspace
Создаём проект типа workspace и прописываем в его файле Cargo.toml верхнего уровня все библиотеки с версиями (в примере anyhow) в спец разделе [workspace.dependencies]:
[dependencies]
anyhow.workspace = true
[workspace]
members = ["greeter"]
[workspace.dependencies]
anyhow = "1.0.99"
При этом в отдельном разделе [dependencies] указываем, что библиотеки будут распространяться на весь проект. Далее, создаём модуль внутри workspace (в примере = greeter) и в его файле Cargo.toml прописываем, что библиотека берётся из зависимостей workspace:
[dependencies]
anyhow = { workspace = true }
Можно добавлять features к библиотеке из workspace на этапе описания вложенных модулей:
[dependencies] regex = { workspace = true, features = ["unicode"] }
Проверка зависимостей
Можно построить дерево зависимостей и проверить правильность написания cargo.toml файла:
Clippy
Настройка
Clippy идёт в составе стандартной поставки Rustup.
Пример конфигурации:
cargo clippy --fix -- \
-W clippy::pedantic \
-W clippy::nursery \
-W clippy::unwrap_used \
-W clippy::expect_used
VSCode Settings
cargo check: поменять check на clippy: "rust-analyzer.check.command": "clippy"
Книга
У Clippy есть своя книга в формате Markdown:
cargo install mdbook
# Run from top level of your rust-clippy directory:
mdbook serve book --open
# Goto http://localhost:3000 to see the book
Исключения
Allow Unused / dead code
Убрать warnings на тему неиспользуемых функций или переменных - самой первой строчкой кода включить директиву:
#![allow(unused)]
fn main() {}
Либо у конкретных функций указывать:
#![allow(dead_code)]
fn some_func() { todo!() }
Panamax
Cargo OFFLINE
Для создания локального сервера можно скачать все пакеты Cargo с помощью проекта Panamax.
cargo install --locked panamax
panamax init ~/test/my-mirror
Нужно зайти в папку my-mirror, проверить настройки в файле mirror.toml. И далее запустить синхронизацию:
panamax sync ~/test/my-mirror
Далее, можно публиковать зеркало по веб через встроенный сервер (по порту 8080):
panamax serve ~/test/my-mirror
На индекс странице сервера будет справка по подключению Rust клиентов к зеркалу. В частности, посредством создания файла настроек ~/.cargo/config :
[source.my-mirror]
registry = "http://panamax.local/crates.io-index"
[source.crates-io]
replace-with = "my-mirror"