$ sudo teach IT
Модуль 7 · Публикация крейтов

Подготовка к публикации

Перед публикацией на crates.io нужно правильно заполнить Cargo.toml и проверить крейт командой cargo publish --dry-run.

📖 Теория 🕐 ~20 минут
📋

Cargo.toml — обязательные поля

Для публикации нужно заполнить больше полей чем при обычной разработке:

Cargo.toml
[package]
name = "my-awesome-lib"         # уникальное имя на crates.io
version = "0.1.0"               # начинайте с 0.1.0
edition = "2021"

# Необязательные но рекомендуемые:
description = "Краткое описание — одна строка"
license = "MIT OR Apache-2.0"   # стандартная для Rust-крейтов
authors = ["Your Name "]
repository = "https://github.com/you/my-awesome-lib"
homepage = "https://example.com"
documentation = "https://docs.rs/my-awesome-lib"
readme = "README.md"            # путь к README файлу
keywords = ["keyword1", "keyword2"]   # макс. 5
categories = ["data-structures"]      # из списка crates.io

[dependencies]
# Только зависимости из crates.io (не path/git)
license — используйте SPDX-идентификаторы. Стандарт Rust: MIT OR Apache-2.0. Без лицензии крейт нельзя использовать в проектах.
keywords — влияют на поисковую выдачу на crates.io. Максимум 5 слов.
categories — из фиксированного списка crates.io/category_slugs. Максимум 5.
🧪

cargo publish --dry-run — проверка

Терминал
cargo publish --dry-run    # проверить без отправки
cargo package              # создать .crate файл и показать его содержимое
cargo package --list       # только список файлов которые войдут в пакет

--dry-run выполняет все проверки кроме фактической загрузки. Покажет ошибки если что-то не так с метаданными или зависимостями.

💡 cargo package --list покажет все файлы которые попадут в пакет. Убедитесь что нет секретных файлов (.env, credentials и т.д.).
🚫

Что исключить из пакета

По умолчанию в пакет попадает всё кроме того что в .gitignore. Можно явно управлять через Cargo.toml:

Cargo.toml
[package]
# Исключить папки/файлы из пакета:
exclude = [
    "tests/fixtures/*",
    "benches/",
    "*.png",
]

# Или наоборот — явно включить только нужное:
include = [
    "src/**",
    "Cargo.toml",
    "README.md",
    "LICENSE*",
]
📌 Что важно запомнить
→ Обязательные поля публикации: name, version, edition, license, description
→ cargo publish --dry-run — проверить всё без отправки
→ cargo package --list — посмотреть что войдёт в пакет
→ include/exclude — управлять содержимым пакета