Сравнение экосистем Chromium и Cargo
Сообщество Rust обычно использует cargo и библиотеки с crates.io. Chromium собирается с помощью gn и ninja и тщательно подобранного набора зависимостей.
Когда вы пишете код на Rust, у вас есть такие варианты:
- Использовать
gnиninjaс помощью шаблонов из//build/rust/*.gni(например,rust_static_library, с которым мы встретимся позже). Это использует проверенный инструментарий и крейты Chromium. - Использовать
cargo, но ограничиться проверенным инструментарием и крейтами Chromium - Использовать
cargo, доверяя инструментарию и/или крейтам, загруженным из интернета
Дальше мы сосредоточимся на 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 (некоторые нишевые, некоторые довольно популярные и широко используемые)