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 обычно не включают - чтобы
пользователи библиотеки сами выбирали совместимые версии зависимостей.