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