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:
- Use
gneninjacom a ajuda dos templates de//build/rust/*.gni(por exemplo,rust_static_libraryque veremos mais adiante). Isso usa o conjunto de ferramentas e crates auditados do Chromium. - Use
cargo, mas restrinja-se ao conjunto de ferramentas e crates auditados do Chromium - Use
cargo, confiando em um conjunto de ferramentas e/ou crates baixados da internet
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
cargopode 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
gneninja,cargooffline, 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. (
clappara análise de linha de comando,serdepara serialização/desserialização para/de vários formatos,itertoolspara trabalhar com iteradores, etc.).- O
cargotorna fácil experimentar uma biblioteca (basta adicionar uma única linha aoCargo.tomle começar a escrever o código) - Pode valer a pena comparar como o CPAN ajudou a tornar o
perluma escolha popular. Ou comparar compython+pip.
- O
-
A experiência de desenvolvimento é tornada realmente agradável não apenas pelas ferramentas principais do Rust (por exemplo, usando
rustuppara alternar para uma versão diferente dorustcao 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 fornececargo vetpara agilizar e compartilhar auditorias de segurança; o cratecriterionfornece uma maneira simplificada de executar benchmarks).- O
cargotorna fácil adicionar uma ferramenta viacargo install --locked cargo-vet. - Pode valer a pena comparar com as extensões do Chrome ou as extensões do VScode.
- O
-
Exemplos amplos e genéricos de projetos em que o
cargopode 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 doclappara análise de linha de comando e dotomlpara arquivos de configuração.- Aviso: um motivo único para usar o
cargofoi a indisponibilidade dognao compilar e inicializar a biblioteca padrão do Rust ao compilar o conjunto de ferramentas Rust.) run_gnrt.pyusa a cópia docargoe dorustcdo Chromium.gnrtdepende de bibliotecas de terceiros baixadas da internet, masrun_gnrt.pypede aocargoque apenas o conteúdo--lockedseja permitido viaCargo.lock.)
- Aviso: um motivo único para usar o
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 fontesrustc(buscadas no GitHub, revisadas pela equipe do compilador Rust), compilador Rust binário baixado para inicializaçãorustup(pode valer a pena observar que orustupé desenvolvido sob a supervisão da organização https://github.com/rust-lang/ - o mesmo que orustc)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)