Comparando os Ecossistemas do Chromium e do Cargo

A comunidade Rust normalmente usa cargo e bibliotecas de crates.io. O Chromium Ă© compilado usando gn e ninja e um conjunto de dependĂȘncias selecionadas.

Ao escrever cĂłdigo em Rust, suas escolhas sĂŁo:

Daqui em diante, estaremos focando em gn e ninja, porque Ă© assim que o cĂłdigo Rust pode ser compilado no navegador Chromium. Ao mesmo tempo, o Cargo Ă© uma parte importante do ecossistema Rust e vocĂȘ deve mantĂȘ-lo em sua caixa de ferramentas.

Mini exercĂ­cio

Dividam-se em pequenos grupos e:

  • Faça um brainstorm de cenĂĄrios em que o cargo pode oferecer uma vantagem e avalie o perfil de risco desses cenĂĄrios.
  • Discuta quais ferramentas, bibliotecas e grupos de pessoas precisam ser confiĂĄveis ao usar gn e ninja, cargo offline, etc.

Peça aos alunos que evitem olhar as notas do apresentador antes de completar o exercício. Supondo que as pessoas que fazem o curso estejam fisicamente juntas, peça-lhes que discutam em pequenos grupos de 3-4 pessoas.

Notas/dicas relacionadas à primeira parte do exercício (“cenários em que o Cargo pode oferecer uma vantagem”):

  • É fantĂĄstico que, ao escrever uma ferramenta ou prototipar uma parte do Chromium, tenha-se acesso ao rico ecossistema de bibliotecas do crates.io. HĂĄ um crate para quase tudo e eles geralmente sĂŁo bastante agradĂĄveis de usar. (clap para anĂĄlise de linha de comando, serde para serialização/desserialização para/de vĂĄrios formatos, itertools para trabalhar com iteradores, etc.).

    • O cargo torna fĂĄcil experimentar uma biblioteca (basta adicionar uma Ășnica linha ao Cargo.toml e começar a escrever o cĂłdigo)
    • Pode valer a pena comparar como o CPAN ajudou a tornar o perl uma escolha popular. Ou comparar com python + pip.
  • A experiĂȘncia de desenvolvimento Ă© tornada realmente agradĂĄvel nĂŁo apenas pelas ferramentas principais do Rust (por exemplo, usando rustup para alternar para uma versĂŁo diferente do rustc ao testar um crate que precisa funcionar no nightly, estĂĄvel atual e estĂĄvel antigo), mas tambĂ©m por um ecossistema de ferramentas de terceiros (por exemplo, a Mozilla fornece cargo vet para agilizar e compartilhar auditorias de segurança; o crate criterion fornece uma maneira simplificada de executar benchmarks).

    • O cargo torna fĂĄcil adicionar uma ferramenta via cargo install --locked cargo-vet.
    • Pode valer a pena comparar com as extensĂ”es do Chrome ou as extensĂ”es do VScode.
  • Exemplos amplos e genĂ©ricos de projetos em que o cargo pode ser a escolha certa:

    • Talvez surpreendentemente, o Rust estĂĄ se tornando cada vez mais popular na indĂșstria para escrever ferramentas de linha de comando. A amplitude e a ergonomia das bibliotecas sĂŁo comparĂĄveis ao Python, enquanto sĂŁo mais robustas (graças ao rico sistema de tipos) e executam mais rĂĄpido (como uma linguagem compilada, em vez de interpretada).
    • Participar do ecossistema Rust requer o uso de ferramentas padrĂŁo do Rust, como o Cargo. Bibliotecas que desejam obter contribuiçÔes externas e desejam ser usadas fora do Chromium (por exemplo, em ambientes de compilação Bazel ou Android/Soong) devem usar o Cargo.
  • Exemplos de projetos relacionados ao Chromium que sĂŁo baseados no cargo:

    • serde_json_lenient (experimentado em outras partes do Google, o que resultou em PRs com melhorias de desempenho)
    • Bibliotecas Fontations como font-types
    • Ferramenta gnrt (vamos conhecĂȘ-la mais adiante no curso) que depende do clap para anĂĄlise de linha de comando e do toml para arquivos de configuração.
      • Aviso: um motivo Ășnico para usar o cargo foi a indisponibilidade do gn ao compilar e inicializar a biblioteca padrĂŁo do Rust ao compilar o conjunto de ferramentas Rust.)
      • run_gnrt.py usa a cĂłpia do cargo e do rustc do Chromium. gnrt depende de bibliotecas de terceiros baixadas da internet, mas run_gnrt.py pede ao cargo que apenas o conteĂșdo --locked seja permitido via Cargo.lock.)

Os alunos podem identificar os seguintes itens como sendo implicitamente ou explicitamente confiĂĄveis:

  • rustc (o compilador Rust), que por sua vez depende das bibliotecas LLVM, do compilador Clang, das fontes rustc (buscadas no GitHub, revisadas pela equipe do compilador Rust), compilador Rust binĂĄrio baixado para inicialização
  • rustup (pode valer a pena observar que o rustup Ă© desenvolvido sob a supervisĂŁo da organização https://github.com/rust-lang/ - o mesmo que o rustc)
  • cargo, rustfmt, etc.
  • Diversas infraestruturas internas (robĂŽs que compilam rustc, sistema para distribuir o conjunto de ferramentas prĂ©-compilado para engenheiros do Chromium, etc.)
  • Ferramentas do Cargo como cargo audit, cargo vet, etc.
  • Bibliotecas Rust hospedadas em //third_party/rust (auditadas por security@chromium.org)
  • Outras bibliotecas Rust (algumas de nicho, algumas bastante populares e comumente usadas)