Порівняння екосистем 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 (деякі нішеві, деякі досить популярні та часто застосовуються)