Comparación de los ecosistemas de Chromium y Cargo
The Rust community typically uses cargo and libraries from crates.io. Chromium is built using gn and ninja and a curated set of dependencies.
A la hora de escribir código en Rust, hay disponibles varias opciones:
- Usar
gnyninjacon la ayuda de las plantillas de//build/rust/*.gni(por ejemplo,rust_static_library, que veremos más adelante). Se usan la cadena de herramientas y los crates auditados de Chromium. - Usar
cargo, pero restringiendo el uso de la cadena de herramientas y los crates auditados de Chromium. - Usa
cargocon una cadena de herramientas o crates descargados de Internet.
A partir de ahora, nos centraremos en gn y ninja, ya que así es como se puede compilar el código de Rust en el navegador Chromium. De igual forma, Cargo es una parte importante del ecosistema de Rust y deberías conservarlo en tu caja de herramientas.
Ejercicio rápido
Formad grupos pequeños para:
- Hacer una lluvia de ideas sobre situaciones en las que
cargopueda ofrecer ventajas y evaluar el perfil de riesgo. - Debatir en qué herramientas, bibliotecas y grupos de personas hay que confiar al usar
gnyninja,cargooffline, etc.
Pide a los participantes que eviten mirar las notas del orador antes de completar el ejercicio. Suponiendo que todas las personas que hacen el curso están en la misma sala, pídeles que hablen en grupos pequeños de 3 a 4 personas.
Notas y sugerencias relacionadas con la primera parte del ejercicio (“situaciones en las que Cargo puede ofrecer ventajas”):
-
Es genial que al escribir una herramienta o crear prototipos de una parte de Chromium se pueda acceder al extenso ecosistema de bibliotecas crates.io. Hay un crate para casi cualquier cosa y suelen ser muy fáciles de usar (
clappara el análisis de la línea de comandos,serdepara la serialización y deserialización a/desde varios formatos,itertoolspara trabajar con iteradores, etc.).cargopermite probar una biblioteca fácilmente (solo hay que añadir una línea aCargo.tomly empezar a escribir el código).- Merece la pena comparar cómo la CPAN ayudó a que
perlfuera una opción popular o compararlo conpython+pip.
-
La experiencia de desarrollo no solo es agradable gracias a las herramientas principales de Rust (por ejemplo, al usar
rustuppara cambiar a una versión diferente derustccuando se prueba un crate que necesita funcionar en nightly, stable actual y antiguas versiones de stable), sino también a un ecosistema de herramientas de terceros (por ejemplo, Mozilla proporcionacargo vetpara optimizar y compartir auditorías de seguridad; el cratecriterionofrece un método optimizado para ejecutar comparativas).cargopermite añadir fácilmente una herramienta mediantecargoinstall --locked cargo-vet.- Merece la pena compararlo con las extensiones de Chrome o con las de VScode.
-
Ejemplos generales y genéricos de proyectos en los que
cargopuede ser la opción más adecuada:- Sorprendentemente, Rust se está volviendo cada vez más popular en el sector por su función de escritura de herramientas de línea de comandos. La amplitud y la ergonomía de las bibliotecas son similares a las de Python, pero son más sólidas (gracias al sistema de tipos enriquecido) y funcionan más rápido (como lenguaje compilado en lugar de interpretado).
- Para participar en el ecosistema de Rust, es necesario usar herramientas estándar de Rust, como Cargo. Las bibliotecas que quieran recibir contribuciones externas y actuar fuera de Chromium (por ejemplo, en entornos de desarrollo de Bazel o Android/Soong) deberían utilizar Cargo.
-
Ejemplos de proyectos relacionados con Chromium que se basan en
cargo:serde_json_lenient(experimentado en otras partes de Google que ha dado lugar a PRs con mejoras de rendimiento).- Bibliotecas de fuentes, como
font-types. - La herramienta
gnrt(la veremos más adelante en el curso), que depende declappara el análisis de la línea de comandos y detomlpara los archivos de configuración.- Disclaimer: a unique reason for using
cargowas unavailability ofgnwhen building and bootstrapping Rust standard library when building Rust toolchain. run_gnrt.pyuses Chromium’s copy ofcargoandrustc.gnrtdepends on third-party libraries downloaded from the internet, butrun_gnrt.pyaskscargothat only--lockedcontent is allowed viaCargo.lock.)
- Disclaimer: a unique reason for using
Los participantes pueden tratar de identificar si los siguientes elementos son de confianza implícita o explícita:
rustc(el compilador de Rust), que a su vez depende de las bibliotecas LLVM, el compilador Clang, las fuentesrustc(obtenidas de GitHub y revisadas por el equipo de compilación de Rust), y el compilador binario de Rust descargado para el bootstrapping.rustup(merece la pena destacar querustupse desarrolla en la misma organización querustc, https://github.com/rust-lang/).cargo,rustfmt, etc.- Varias infraestructuras internas (bots que compilan
rustc, sistemas para distribuir la cadena de herramientas precompiladas a los ingenieros de Chromium, etc.) - Herramientas de Cargo, como
cargo audit,cargo vet, etc. - Bibliotecas de Rust incluidas en
//third_party/rust(auditoría de security@chromium.org). - Otras bibliotecas de Rust (algunas de nicho, otras bastante populares y de uso común).