Порівняння екосистем 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при тестуванні крейту, який має працювати на нічних, поточних стабільних та старих стабільних версіях), але й екосистема сторонніх інструментів (наприклад, Mozilla надаєcargo vetдля впорядкування та спільного використання аудитів безпеки; крейтcriterionнадає спрощений спосіб запуску бенчмарків).cargoспрощує додавання інструмента за допомогоюcargo install --locked cargo-vet.- Можливо, варто порівняти з розширеннями Chrome або VScode.
-
Широкі, загальні приклади проектів, де
cargoможе бути правильним вибором:- Можливо, це дивно, але Rust стає все більш популярним в індустрії написання інструментів командного інтерфейсу. Широта та ергономічність бібліотек порівнянна з Python, при цьому вона більш надійна (завдяки багатій системі типів) і працює швидше (як скомпільована, а не інтерпретована мова).
- Для участі в екосистемі Rust потрібно використовувати стандартні інструменти Rust, такі як Cargo. Бібліотекам, які хочуть отримати зовнішні надходження і використовувати їх поза межами Chromium (наприклад, у середовищах збірки Bazel або Android/Soong), ймовірно, варто використовувати Cargo.
-
Приклади проектів, пов’язаних з Chromium, які базуються на
cargo:serde_json_lenient( з ним експериментували в інших частинах Google, що призвело до PRs з покращенням продуктивності)- Бібліотеки шрифтів на кшталт
font-types - Інструмент
gnrt(ми познайомимося з ним пізніше у курсі), який залежить відclapдля розбору командного рядка і відtomlдля конфігураційних файлів.- Застереження: єдиною причиною використання
cargoбула недоступністьgnпри збиранні та завантаженні стандартної бібліотеки Rust під час побудови інструментарію Rust. - У
run_gnrt.pyвикористовується копіяcargoтаrustcу Chromium.gnrtзалежить від сторонніх бібліотек, завантажених з інтернету, томуrun_gnrt.pyзапитуєcargoпро те, що лише--lockedконтент дозволено черезCargo.lock.
- Застереження: єдиною причиною використання
Студенти можуть визначити наступні пункти як такі, що викликають у них явну чи неявну довіру:
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 (деякі нішеві, деякі досить популярні та часто застосовуються)