Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Сравнение экосистем Chromium и Cargo

Сообщество Rust обычно использует cargo и библиотеки с crates.io. Chromium собирается с помощью gn и ninja и тщательно подобранного набора зависимостей.

Когда вы пишете код на Rust, у вас есть такие варианты:

Дальше мы сосредоточимся на gn и ninja, потому что именно так код Rust собирается в браузер Chromium. При этом Cargo — важная часть экосистемы Rust, и её стоит держать в арсенале.

Мини-упражнение

Разбейтесь на небольшие группы и:

  • Придумайте сценарии, в которых cargo может дать преимущество, и оцените риски этих сценариев.
  • Обсудите, каким инструментам, библиотекам и группам людей нужно доверять при использовании gn и ninja, офлайн-cargo и т. д.

Попросите студентов не заглядывать в заметки докладчика до завершения упражнения. Если участники курса физически находятся вместе, попросите их обсуждать в небольших группах по 3–4 человека.

Заметки и подсказки к первой части упражнения («сценарии, где Cargo может дать преимущество»):

  • Замечательно, что при написании инструмента или прототипировании части Chromium доступна богатая экосистема библиотек crates.io. Почти для всего есть крейт, и обычно с ними приятно работать. (clap для разбора аргументов командной строки, serde для сериализации и десериализации в различные форматы, itertools для работы с итераторами и т. д.).

    • cargo упрощает опробование библиотеки (достаточно добавить одну строку в Cargo.toml и начать писать код).
    • Возможно, стоит сравнить, как CPAN помог сделать perl популярным выбором, или сравнить с python + pip.
  • Опыт разработки делают действительно удобным не только базовые инструменты Rust (например, использование rustup, чтобы переключиться на другую версию rustc при тестировании крейта, который должен работать на nightly, текущем stable и более старом stable), но и экосистема сторонних инструментов (например, Mozilla предоставляет cargo vet для упрощения и совместного использования аудитов безопасности; крейт criterion даёт удобный способ запускать бенчмарки).

    • cargo позволяет легко добавить инструмент командой cargo install --locked cargo-vet.
    • Возможно, стоит сравнить это с расширениями Chrome или расширениями VS Code.
  • Общие, обобщённые примеры проектов, где cargo может быть правильным выбором:

    • Возможно, неожиданно, но Rust всё популярнее в индустрии для написания инструментов командной строки. Широта и удобство библиотек сопоставимы с Python, но при этом код надёжнее (благодаря богатой системе типов) и работает быстрее (как компилируемый, а не интерпретируемый язык).
    • Участие в экосистеме Rust требует использования стандартных инструментов Rust, таких как Cargo. Библиотеки, которые хотят получать внешний вклад и использоваться за пределами Chromium (например, в средах сборки Bazel или Android/Soong), должны использовать Cargo.
  • Примеры связанных с Chromium проектов на базе cargo:

    • serde_json_lenient (его опробовали в других частях Google, что привело к PR с улучшениями производительности)
    • Библиотеки Fontations, например font-types
    • Инструмент gnrt (с ним мы встретимся позже в курсе), который зависит от clap для разбора командной строки и от toml для конфигурационных файлов.
      • Оговорка: одна особая причина использовать cargo — недоступность gn при сборке и начальной загрузке стандартной библиотеки Rust во время сборки инструментария Rust.
      • run_gnrt.py использует копию cargo и rustc из Chromium. gnrt зависит от сторонних библиотек, загружаемых из интернета, но run_gnrt.py требует от cargo разрешать только содержимое, зафиксированное в Cargo.lock (через --locked).)

Студенты могут назвать следующие элементы как неявно или явно доверяемые:

  • rustc (компилятор Rust), который, в свою очередь, зависит от библиотек LLVM, компилятора Clang, исходников rustc (загружаются с GitHub и проверяются командой компилятора Rust), бинарного компилятора Rust, загружаемого для начальной загрузки
  • rustup (стоит отметить, что rustup разрабатывается под эгидой организации https://github.com/rust-lang/ — так же как и rustc)
  • cargo, rustfmt и т. д.
  • Различная внутренняя инфраструктура (боты, которые собирают rustc, система распространения готового инструментария инженерам Chromium и т. д.)
  • Инструменты для Cargo, например cargo audit, cargo vet и т. д.
  • Библиотеки Rust, внедрённые в //third_party/rust (проверены security@chromium.org)
  • Другие библиотеки Rust (некоторые нишевые, некоторые довольно популярные и широко используемые)