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
gn
eninja
com a ajuda dos templates de//build/rust/*.gni
(por exemplo,rust_static_library
que 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
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
eninja
,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 aoCargo.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 compython
+pip
.
- O
-
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 dorustc
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 fornececargo vet
para agilizar e compartilhar auditorias de segurança; o cratecriterion
fornece uma maneira simplificada de executar benchmarks).- O
cargo
torna 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
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 doclap
para análise de linha de comando e dotoml
para arquivos de configuração.- Aviso: um motivo único para usar o
cargo
foi a indisponibilidade dogn
ao compilar e inicializar a biblioteca padrão do Rust ao compilar o conjunto de ferramentas Rust.) run_gnrt.py
usa a cópia docargo
e dorustc
do Chromium.gnrt
depende de bibliotecas de terceiros baixadas da internet, masrun_gnrt.py
pede aocargo
que apenas o conteúdo--locked
seja 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)