← Оглавление

4.0 Фамильяр идёт на рынок

Ни одна мастерская не производит всё, что использует. Гвозди приходят от кузнеца, стекло - от стекольщика, каждый хороший инструмент - от того, кто умеет его делать лучше других. Мастер, который отказывается от чужого труда из принципа, работает дольше и хуже - и гордится этим отдельно. Cargo знает, где найти то, что нужно.

Что нужно

Чтобы задачи пережили остановку программы, их нужно записать на диск. Но прежде чем записать - перевести: структура данных в памяти и байты в файле это разные вещи. Нужен инструмент, который умеет одно превращать в другое и обратно.

В Rust для этого служит serde - библиотека сериализации. Она не входит в стандартную библиотеку: это отдельный пакет на открытом реестре crates.io. Вместе с ней понадобится serde_json - реализация формата JSON.

На рынок

cargo add добавляет зависимость в Cargo.toml и фиксирует актуальную версию. Для serde нужен флаг --features derive:

cargo add serde --features derive
cargo add serde_json

Cargo ответит примерно так:

    Updating crates.io index
      Adding serde v1.0.x to dependencies
             Features:
             + derive
    Updating crates.io index
      Adding serde_json v1.0.x to dependencies

В Cargo.toml появляется новый раздел:

# Cargo.toml - CHANGED
[dependencies]
serde = { version = "1", features = ["derive"] }
serde_json = "1"

[dependencies] - список всего, что нужно крейту помимо стандартной библиотеки. version = "1" означает: любая обратно совместимая версия из ветки 1.x. При следующем запуске make ci Cargo скачает пакеты, скомпилирует их и сделает доступными для кода tq.

--features derive включает необязательную часть serde. Что именно она даёт - следующая глава.

cargo add удобен, но не обязателен. Те же строки можно вписать в Cargo.toml вручную - cargo build при следующем запуске заметит изменения и скачает всё сам.

Результат

make ci проходит. При первом запуске Cargo скачает и скомпилирует новые зависимости - это займёт несколько секунд. Результат кэшируется; следующий запуск быстрее.

Код tq не менялся - все четырнадцать тестов те же. Изменился крейт: у него теперь есть зависимости, и Cargo знает, где их взять.

Полный код tq для этой главы - 4-memory/00-the-familiar-goes-to-market/.


Lore: Cargo.lock

После первой загрузки Cargo создаёт Cargo.lock - точный слепок всех зависимостей: какие крейты, в каких версиях, с какими контрольными суммами. Если Cargo.toml говорит “мне нужна версия 1.x”, то Cargo.lock говорит “сегодня это была 1.0.228”.

Cargo.lock нужно добавлять в git. Для бинарных крейтов - всегда: это гарантия воспроизводимой сборки. На другой машине, в другой день cargo build соберёт ровно то же самое. Без Cargo.lock каждый запуск может принести чуть другую версию.

Для библиотек, публикуемых на crates.io, Cargo.lock в git обычно не включают - чтобы пользователи библиотеки сами выбирали совместимые версии зависимостей.