Sebastien Rousseau

RUST

Оптимізація розробки бібліотек Rust за допомогою генерації коду

LibMake: генератор коду Rust, який застосовує найкращі практики з першого дня.

4 хв читання
Banner for: Оптимізація розробки бібліотек Rust за допомогою генерації коду

LibMake ⧉ — це відкритий CLI-інструмент та бібліотека для Rust, яка генерує повну структуру проєкту бібліотеки за один виклик. Вона усуває розрив між cargo new --lib (яка створює лише мінімальні файли Cargo.toml та src/lib.rs) та готовим до розгортання налаштуванням бібліотеки (яке вимагає вручну додавати коментарі документації, CI, тестові середовища, структуру для бенчмарків, CONTRIBUTING.md та файли ліцензій).

У цій статті описується, що саме генерує LibMake, як працюють режими конфігураційного файлу та CLI, згенерована структура CI, а також система шаблонізації.

Встановлення та базове використання #

LibMake опубліковано на crates.io та встановлюється за допомогою Cargo:

cargo install libmake

Мінімальний виклик CLI генерує бібліотеку із вказаною назвою в поточному каталозі:

libmake \
  --author "Jane Smith" \
  --email "jane@example.com" \
  --name "my_library" \
  --description "A Rust library for doing useful things" \
  --version "0.1.0" \
  --licence "MIT OR Apache-2.0" \
  --repository "https://github.com/example/my_library" \
  --rustversion "1.70.0" \
  --edition "2021" \
  --output "my_library"

Додаткові необов'язкові прапорці включають --categories, --keywords, --homepage, --documentation, --readme та --build.

Режим конфігураційного файлу #

Для використання в команді всі прапорці CLI можна описати у конфігураційному файлі TOML:

# libmake.toml


author      = "Jane Smith"
email       = "jane@example.com"
name        = "my_library"
description = "A Rust library for doing useful things"
version     = "0.1.0"
licence     = "MIT OR Apache-2.0"
repository  = "https://github.com/example/my_library"
rustversion = "1.70.0"
edition     = "2021"
output      = "my_library"
categories  = ["algorithms", "data-structures"]
keywords    = ["rust", "library"]

Викликається так:

libmake --config libmake.toml

LibMake також приймає конфігураційні формати JSON, YAML та CSV за допомогою прапорців --config-json, --config-yaml та --config-csv відповідно. Додавання libmake.toml до кореня репозиторію надає кожному розробнику відтворювану основу структури проєкту, а зміни у конфігурації шаблонів відображаються у Git-дифах.

Згенерована структура проєкту #

Виклик LibMake створює таку структуру каталогу:

my_library/
├── .github/
│   └── workflows/
│       └── release.yml     # повна матриця CI
├── benches/
│   └── lib_benchmarks.rs   # заглушка для бенчмарку Criterion
├── src/
│   └── lib.rs              # з коментарями документації, deny(missing_docs)
├── tests/
│   └── lib_tests.rs        # заглушка для інтеграційного тесту
├── CONTRIBUTING.md
├── Cargo.toml              # повні метадані
├── LICENSE-APACHE
├── LICENSE-MIT
└── README.md

Згенерований файл src/lib.rs містить коментар документації на рівні пакета (crate), #![deny(missing_docs)], #![doc = include_str!("../README.md")] для підтягування README в rustdoc, а також заглушку публічного типу з відповідним коментарем документації. Ці рішення відповідають вимогам Rust API Guidelines, згідно з якими всі публічні елементи повинні мати документацію.

Згенерований файл benches/lib_benchmarks.rs використовує Criterion.rs та потребує додавання criterion як dev-залежності, яку LibMake вставляє в Cargo.toml автоматично.

Робочий процес CI у GitHub Actions #

Згенерований файл .github/workflows/release.yml запускає п'ять завдань для кожного push-запиту та pull-запиту:

Завдання Toolchain Що перевіряється
test stable, beta, nightly (матриця) cargo test --all-features
clippy stable cargo clippy -- -D warnings
fmt stable cargo fmt --check
audit stable cargo audit (cargo-audit встановлюється під час виконання завдання)
doc stable cargo doc --no-deps (завершується помилкою у разі відсутності документації)

Завдання для версії nightly має параметр continue-on-error: true, тому регресія в nightly-версії не блокує злиття гілок (merges), водночас інформація про збій все одно відображається в результатах запуску робочого процесу.

Шаблонізація за допомогою Tera #

LibMake використовує двигун шаблонів Tera (подібний до Jinja2 синтаксис для Rust) для рендерингу всіх згенерованих файлів. Кожен шаблон отримує повну структуру конфігурації як контекст:

{{ name }}            → my_library
{{ author }}          → Jane Smith
{{ edition }}         → 2021
{{ description }}     → A Rust library for doing useful things

Каталоги користувацьких шаблонів підтримуються за допомогою прапорця --template:

libmake --config libmake.toml --template ./my_templates/

Користувацький каталог має повторювати структуру шаблонів за замовчуванням (мати ті самі імена файлів). Будь-який файл, наявний у користувацькому каталозі, замінює відповідний вбудований шаблон; для файлів, які відсутні в користувацькому каталозі, використовуються вбудовані версії. Це дозволяє здійснювати часткове перевизначення — наприклад, замінити лише шаблон робочого процесу CI, зберігши при цьому стандартні шаблони src/lib.rs та Cargo.toml.

Часті запитання #

Чим LibMake відрізняється від cargo new --lib? cargo new --lib створює мінімальний проєкт, який містить лише Cargo.toml та src/lib.rs (з одним блоком #[cfg(test)]). LibMake генерує повну структуру — інтеграційні тести, бенчмарки, CI, CONTRIBUTING.md, файли подвійної ліцензії та належним чином документований src/lib.rs — налаштований з реальними метаданими проєкту, а не з тимчасовими плейсхолдерами.

Чи можна використовувати LibMake з наявним Cargo workspace? LibMake генерує автономний каталог пакета (crate). Щоб додати згенерований пакет до наявного робочого простору (workspace), додайте вихідний шлях до масиву members робочого простору у кореневому Cargo.toml. LibMake не змінює наявні файли робочого простору.

Чи можу я оновити шаблони структури після початкової генерації? LibMake генерує файли лише один раз; він не відстежує та не оновлює раніше згенеровані проєкти. Щоб застосувати оновлені шаблони, рекомендованим підходом є повторний запуск LibMake у тимчасовий каталог і порівняння результатів із наявним пакетом для вибіркового внесення бажаних змін.

Які редакції (editions) Rust та значення MSRV підтримує LibMake? LibMake приймає будь-який рядок для --edition та --rustversion і записує ці значення безпосередньо в Cargo.toml. Він не перевіряє, чи є вказана редакція або MSRV реальною версією Rust, тому користувачі самі відповідають за надання коректних значень.

Література #

  1. Rousseau, S. LibMake — A code generator to reduce repetitive tasks and build high-quality Rust libraries. GitHub, 2023. https://github.com/sebastienrousseau/libmake
  2. The Rust Programming Language. Rust API Guidelines. GitHub, 2023. https://rust-lang.github.io/api-guidelines/
  3. The Cargo Book. Package Layout. The Rust Programming Language, 2023. https://doc.rust-lang.org/cargo/guide/project-layout.html
  4. Keats, V. et al. Tera — A template engine inspired by Jinja2 and Django templates. GitHub, 2023. https://keats.github.io/tera/

Останній перегляд .

Останній перегляд .

Перепублікувати цю статтю

Скопіювати формат для Medium

# Оптимізація розробки бібліотек Rust за допомогою генерації коду — Sebastien Rousseau

> Originally published at [https://sebastienrousseau.com/uk/2023-10-26-libmake-henerator-kodu-dlya-rust-bibliotek/](https://sebastienrousseau.com/uk/2023-10-26-libmake-henerator-kodu-dlya-rust-bibliotek/)

Покращте розробку бібліотек Rust за допомогою LibMake: інструменту генерації коду, який застосовує найкращі практики та створює початковий код, заощаджуючи час і зусилля розробників.

Read the full article on sebastienrousseau.com: https://sebastienrousseau.com/uk/2023-10-26-libmake-henerator-kodu-dlya-rust-bibliotek/

Скопіювати формат для Mastodon

Оптимізація розробки бібліотек Rust за допомогою генерації коду — Sebastien Rousseau

Покращте розробку бібліотек Rust за допомогою LibMake: інструменту генерації коду, який застосовує найкращі практики та створює початковий код, заощаджуючи час і зусилля розробників.

https://sebastienrousseau.com/uk/2023-10-26-libmake-henerator-kodu-dlya-rust-bibliotek/

Копіювати відформатоване для LinkedIn

Оптимізація розробки бібліотек Rust за допомогою генерації коду — Sebastien Rousseau

Покращте розробку бібліотек Rust за допомогою LibMake: інструменту генерації коду, який застосовує найкращі практики та створює початковий код, заощаджуючи час і зусилля розробників.

Ось ключові стратегічні висновки:

- Встановлення та базове використання. LibMake опубліковано на crates.io та встановлюється за допомогою Cargo:.
- Режим конфігураційного файлу. Для використання в команді всі прапорці CLI можна описати у конфігураційному файлі TOML:.
- Згенерована структура проєкту. Виклик LibMake створює таку структуру каталогу:.
- Робочий процес CI у GitHub Actions. Згенерований файл .github/workflows/release.yml запускає п'ять завдань для кожного push-запиту та pull-запиту:.

Яким є підхід вашої організації до викликів, описаних у цій статті?

→ https://sebastienrousseau.com/uk/2023-10-26-libmake-henerator-kodu-dlya-rust-bibliotek/

#Rust #Бібліотека #Розробка #Код #Генератор

Sebastien Rousseau | CC-BY-4.0
Цитувати цю статтю

Оптимізація розробки бібліотек Rust за допомогою генерації коду — Sebastien Rousseau

Покращте розробку бібліотек Rust за допомогою LibMake: інструменту генерації коду, який застосовує найкращі практики та створює початковий код, заощаджуючи час і зусилля розробників.

BibTeX

@online{rousseau2023оптимізація,
  author  = {Rousseau, Sebastien},
  title   = {{Оптимізація розробки бібліотек Rust за допомогою генерації коду — Sebastien Rousseau}},
  year    = {2023},
  url     = {https://sebastienrousseau.com/uk/2023-10-26-libmake-henerator-kodu-dlya-rust-bibliotek/},
  urldate = {2023}
}

RIS

TY  - GEN
AU  - Rousseau, Sebastien
TI  - Оптимізація розробки бібліотек Rust за допомогою генерації коду — Sebastien Rousseau
PY  - 2023
UR  - https://sebastienrousseau.com/uk/2023-10-26-libmake-henerator-kodu-dlya-rust-bibliotek/
ER  -

Vancouver

Rousseau S. Оптимізація розробки бібліотек Rust за допомогою генерації коду — Sebastien Rousseau. sebastienrousseau.com. 2023 Oct 26. Available from: https://sebastienrousseau.com/uk/2023-10-26-libmake-henerator-kodu-dlya-rust-bibliotek/

Chicago

Rousseau, Sebastien. "Оптимізація розробки бібліотек Rust за допомогою генерації коду — Sebastien Rousseau." sebastienrousseau.com. October 26, 2023. https://sebastienrousseau.com/uk/2023-10-26-libmake-henerator-kodu-dlya-rust-bibliotek/.

APA

Rousseau, S. (2023, October 26). Оптимізація розробки бібліотек Rust за допомогою генерації коду — Sebastien Rousseau. sebastienrousseau.com. https://sebastienrousseau.com/uk/2023-10-26-libmake-henerator-kodu-dlya-rust-bibliotek/

Перевидати цю статтю

Оптимізація розробки бібліотек Rust за допомогою генерації коду — Sebastien Rousseau

Покращте розробку бібліотек Rust за допомогою LibMake: інструменту генерації коду, який застосовує найкращі практики та створює початковий код, заощаджуючи час і зусилля розробників.

Ця стаття поширюється за ліцензією Creative Commons Attribution 4.0 International. Перевидання вимагає посилання на канонічну URL-адресу.

Оптимізація розробки бібліотек Rust за допомогою генерації коду — Sebastien Rousseau

Покращте розробку бібліотек Rust за допомогою LibMake: інструменту генерації коду, який застосовує найкращі практики та створює початковий код, заощаджуючи час і зусилля розробників.

Originally published at https://sebastienrousseau.com/uk/2023-10-26-libmake-henerator-kodu-dlya-rust-bibliotek/ by Sebastien Rousseau.
Licensed under CC-BY-4.0.